35

データベースからファイルパスを取得して、ファイルソースとして使用しています。ソースパスから最後のフォルダーを削除する必要があるので、宛先パスとして使用する新しいフォルダーを作成できます。

ソースファイルパスの例: \\\\ServerName\\Documents\\MasterDocumentFolder\\

その文字列から最後のフォルダを削除して、これを取得する必要があります。 \\\\ServerName\\Documents\\

だから私はこのようなフォルダを作成することができます: \\\\ServerName\\Documents\\NewDocumentFolder1\\

編集:Path.GetDirectoryName()がこの場合に機能しない理由を示すために、サンプルパスを更新しました。

4

7 に答える 7

45

探しているのは、DirectoryクラスのGetParent()メソッドです。

string path = @"C:\Documents\MasterDocumentFolder\";
DirectoryInfo parentDir = Directory.GetParent(path);
// or possibly
DirectoryInfo parentDir = Directory.GetParent(path.EndsWith("\\") ? path : string.Concat(path, "\\"));

// The result is available here
var myParentDir = parentDir.Parent.FullName
于 2012-11-14T17:18:33.243 に答える
12

それは醜いですが、機能します

string path = @"C:\Documents\MasterDocumentFolder\file.any";
var lastFolder = Path.GetDirectoryName(path);
var pathWithoutLastFolder = Path.GetDirectoryName(lastFolder);

ただし、ディレクトリのレベル(ドライブルート)が1つ未満の場合は、にpathWithoutLastFolderなりますnull。そのため、これに対処する必要があります。

于 2012-11-14T17:11:03.437 に答える
5

System.IO.DirectoryInfoは、おそらくあなたが求めていることを達成するための最もクリーンな方法です。

var path = "\\\\ServerName\\Documents\\MasterDocumentFolder\\";
string newPath = new DirectoryInfo(path).Parent.CreateSubdirectory("NewDocumentFolder1").FullName;
Console.WriteLine(newPath.FullName);
//> "\\ServerName\Documents\NewDocumentFolder1\"

DirectoryInfoは、既存のディレクトリまたはアクセス可能なディレクトリを必要としないことに注意してください。

var dir = new DirectoryInfo(@"C:\Asdf\Qwer\Zxcv\Poiu\Lkj\Mn");
Console.WriteLine( dir.Exists );
//> False

しかし、それが存在することを確認するのは簡単です

var dir = new DirectoryInfo(@"C:\Asdf\Qwer\Zxcv\Poiu\Lkj\Mn");
dir.Create();
Console.WriteLine( dir.Exists );
//> True

また、相対パスの解決などの気の利いたことも行います。

var dir = new DirectoryInfo(@"C:\Asdf\Qwer\Zxcv\Poiu\Lkj\..\..\..\Mn");
Console.WriteLine( dir.FullName );
//> C:\Asdf\Qwer\Mn

スラッシュのトリミングと追加に関するその他の回答については、Directory.GetParent( "... \")とDirectoryInfo( "... \")。Parentの動作の違いに注意してください。末尾の\'sを処理する場合の親-DirectoryInfoの方が一貫性があります。

Console.WriteLine( Directory.GetParent( @"C:\Temp\Test" ).FullName );
//> C:\Temp
Console.WriteLine( Directory.GetParent( @"C:\Temp\Test\" ).FullName );
//> C:\Temp\Test
Console.WriteLine( new DirectoryInfo( @"C:\Temp\Test" ).Parent.FullName );
//> C:\Temp
Console.WriteLine( new DirectoryInfo( @"C:\Temp\Test\" ).Parent.FullName );
//> C:\Temp

繰り返しになりますが、末尾のスラッシュを処理しないようにするには、常にPath.Combine()を使用してパスとファイル名を連結します。パスに末尾の\が含まれているかどうかに関係なく、パスは正しく処理されます。

Console.WriteLine( Path.Combine( @"C:\Temp\Test\", "Test.txt" ) );
//> C:\Temp\Test\Test.txt
Console.WriteLine( Path.Combine( @"C:\Temp\Test", "Test.txt" ) );
//> C:\Temp\Test\Test.txt
Console.WriteLine( Path.Combine( @"C:\", "Temp", "Test", "Test.txt" ) );
//> C:\Temp\Test\Test.txt
于 2014-09-17T22:59:58.167 に答える
2

これは、ファイルまたはディレクトリのいずれかであるパスを説明する必要があります

DirectoryInfo parent = null;
if (File.Exists(path))
{
    parent = new FileInfo(path).Directory.Directory
}
if(Directory.Exists(path))
{
    parent = new DirectoryInfo(path).Directory;
}
于 2012-11-14T17:19:10.490 に答える
1

文字列を「\」ごとに分割し、最後の要素を除くすべての要素を結合して新しいパスを再構築してみましたか?

また、元のパスがルートにある場合と、バックスラッシュで終了する場合を考慮する必要があります。

于 2012-11-14T17:11:39.927 に答える
0

このメソッドを使用すると、dirPathによってdirを作成し(dirが存在しない場合)、必要に応じてfilePathからディレクトリを作成できます。

private void CreateDirIfNotExist(string dirPath, bool removeFilename = false)
{
    if (removeFilename)
        dirPath = Directory.GetParent(dirPath).FullName;

    if (!Directory.Exists(dirPath))
        Directory.CreateDirectory(dirPath);
}
于 2016-07-20T22:04:42.723 に答える
-1

VBの場合:

Dim MyNewPath As String = StrReverse(Strings.Split(StrReverse(MyPath), "\", 2)(1))

これはルートまで機能しC:\MyPathますが、ベアフォルダの場合は(検証なしで)失敗します。

明らかに、ファイルが追加されている場合は、別の方法で処理する必要があります。

于 2018-06-20T22:31:49.180 に答える