ファイル名を含むパスからファイル名なしのフルパスを取得


198

組み込みのものSystem.IO.Pathだけでファイルパスが得られますか?

たとえば、私が持っている場合 string

@ "c:\ webserver \ public \ myCompany \ configs \ promo.xml"、

私に与えるBCLメソッドはありますか

「c:\ webserver \ public \ myCompany \ configs \」?



FWIW:パスの「パス」の処理については「与えられた」ので、UNC(UNCパスでGetDirectoryNameを使用してみてください)と規則(たとえば、末尾の/)でより良い期待と統一性を備えた独自のメソッドを使用します。
user2864740 2018

ファイルまたはディレクトリが存在しない限り、promo.xml同じ名前でファイルまたはディレクトリが指定されているかどうかを知る方法はありません。これがおそらくPath.GetDirectoryName()実装が非常に単純で、最後のセグメントを切り捨てるか、または末尾のスラッシュがある場合はそれを削除する理由です。
アベル

回答:


241

Path.GetDirectoryName()...しかし、それに渡すパスにはファイル名が含まれていることを知っておく必要があります。ファイル名かディレクトリ名かに関係なく、パスから最後のビットを削除するだけです(実際にはどちらかはわかりません)。

最初にテストしてパスを検証するFile.Exists()Directory.Exists()、最初にパスで検証して、呼び出す必要があるかどうかを確認できます。Path.GetDirectoryName


2
を呼び出す必要はありませんFile.Exists()。実際、ディレクトリ名がまだ存在していない場合に作成することを目的とする場合は、逆効果になります。
Jon Hanna

3
彼の例では、ファイル名を含むパスを明示的に示しています。それが彼がテストしているパスのパターンであり、それらのパスが既存のファイルを表す場合、File.Exists()を確認することは確かに役立つでしょうが、同意しませんか?もちろん、そうでない場合もあるので、私は彼がファイルやディレクトリでExistsメソッドを「使用できる」と提案しただけです。明らかに、彼の状況に応じて。
Andrew Barberが

はい、ファイル名を含むパス。ファイル名が最初に来るため、ファイルが存在することを示すものは何もありません。
Jon Hanna

4
私の言ったように; これはオプションであり、パスについてわかっていることによっては役立つ場合があります。または、まったく必要ない場合もあります。ただし、同じパスでFile.Exists()とDirectory.Exists()をテストすると、存在するパスがファイルまたはディレクトリかどうかをすばやく簡単に確認できます。
Andrew Barber、

5
クイックリファレンスとして、質問と重複して、「明白な」扱いとしてSystem.IO、これを機能させるために含める必要があります。
cregox 2012

70
Console.WriteLine(Path.GetDirectoryName(@"C:\hello\my\dear\world.hm")); 

2
これが一番。using System.IO;パスメソッドを使用することを忘れないでください
構文エラー

これには末尾のスラッシュが含まれていないことに注意してください(追加は簡単です)
Mingwei Samuel

51

Path.GetDirectoryName()はディレクトリ名を返すので、必要な場合は(末尾の逆ソリッド文字を使用して)を呼び出しますPath.GetDirectoryName(filePath) + Path.DirectorySeparatorChar


12
    string fileAndPath = @"c:\webserver\public\myCompany\configs\promo.xml";

    string currentDirectory = Path.GetDirectoryName(fileAndPath);

    string fullPathOnly = Path.GetFullPath(currentDirectory);

currentDirectory:c:\ webserver \ public \ myCompany \ configs

fullPathOnly:c:\ webserver \ public \ myCompany \ configs


6
この回答を改善するために、上記のコードが質問にどのように回答するかに関する情報をいくつか提供してください。
エリックハウエンシュタイン

1
Path.GetFullPathは、ファイル名なしでフルパスを返します。
コビーウィリアムズ

出力を表示すると役に立ちますが、最後の2行の違いが何なのかわかりません。
gakera 2018

出力は次のようになります-> c:\ webserver \ public \ myCompany \ configs
Williams

5

示されているように 'GetParent()'を使用してください。必要に応じてエラーチェックを追加します。

var fn = openFileDialogSapTable.FileName;
var currentPath = Path.GetFullPath( fn );
currentPath = Directory.GetParent(currentPath).FullName;

4

私はこれを使用し、それはうまくいきます:

string[] filePaths = Directory.GetFiles(Path.GetDirectoryName(dialog.FileName));

foreach (string file in filePaths)
{   
    if (comboBox1.SelectedItem.ToString() == "")
    {
        if (file.Contains("c"))
        {
            comboBox2.Items.Add(Path.GetFileName(file));
        }
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.