2012-11-14 6 views
16

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

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

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

\\\\ServerName\\Documents\\

をだから私はこのようなフォルダを作成することができます編集:Path.GetDirectoryName()がこの場合に動作しない理由を示すために、私のサンプルパスを更新しました。醜いザッツ

+0

データベースから文字列が戻ってきて、すべてのスラッシュが2倍になっていますか?それとも、デバッガで観測していることです(これは正常です)。 –

+0

[完全なディレクトリパスから1つのディレクトリを削除]の可能性のある複製(http://stackoverflow.com/questions/6098209/remove-one-directory-from-full-directory-path) –

答えて

26

何を探してるんですがこれは、パスがファイルまたはディレクトリ

DirectoryInfo parent = null; 
if (File.Exists(path)) 
{ 
    parent = new FileInfo(path).Directory.Directory 
} 
if(Directory.Exists(path)) 
{ 
    parent = new DirectoryInfo(path).Directory; 
} 
+0

結果は 'C:\ Documents \ MasterDocumentFolder'になります –

+0

いいえ、指定した内容にレンダリングできるオブジェクトが生成されますが、Parentプロパティも含まれています。 –

+1

'GetParent()'は親ディレクトリを取得します。末尾の\でのみ期待通りに動作しません。だから、後ろに\を置くか、 'Parent'を使ってもう一度上がってください。いずれの場合も、あなたの答えは正しい結果をもたらさない。 –

7

が、

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

に動作します。しかし、あなたは、ディレクトリの1つのレベル(ドライブルート)未満を持っている場合、あなたはそれに対処する必要がありますので、その後pathWithoutLastFolderは、nullになります。

+0

完全パス(ファイル名)、単一の 'Path.GetDirecotyrName()'だけが必要になります。 –

+0

私はその方法が私のために働いていない理由を示すために私の例のパスを更新しました。 \\を\に変換する余分なステップはありますか? – Mick

+0

これは良い習慣ではなく、代わりにDirectoryInfo.Parentを使用してください –

1

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

また、元のパスがルートにあり、バックスラッシュで終わるかどうかを検討する必要があります。

+2

しかし、それはあまりうまくいかないC#の練習 –

+3

.netにはSystem.IO名前空間とパスが含まれていますこの理由からオブジェクトです。 –

2

はおそらく最もきれいですあなたが求めていることを達成する方法。

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( "... \")の動作の違いに注意してください。一貫した:

再び
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 
+0

式にDirectoryInfo.Existsが含まれているはずですか? –

0

System.IO.DirectoryInfoのいずれかであることを考慮する必要があるディレクトリクラスの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 
0

をこの方法であなたは(ディレクトリが存在しない場合)dirPathのでディレクトリを作成することができますし、

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

      if (!Directory.Exists(dirPath)) 
      { 
       Directory.CreateDirectory(dirPath); 
      } 
     } 
を必要に応じて、filePathにディレクトリを作成します
関連する問題