C#を使用してディレクトリ内のファイル名のみを取得するにはどうすればよいですか?


80

以下のようなコード行を使用すると、個々のファイルのパス全体を含む文字列配列が得られます。

private string[] pdfFiles = Directory.GetFiles("C:\\Documents", "*.pdf");

パス全体ではなく、文字列内のファイル名のみを取得する方法があるかどうかを知りたいのですが。

回答:


160

Path.GetFileNameフルパスからファイル名を取得するために使用できます

private string[] pdfFiles = Directory.GetFiles("C:\\Documents", "*.pdf")
                                     .Select(Path.GetFileName)
                                     .ToArray();

編集:上記のソリューションはLINQを使用しているため、少なくとも.NET3.5が必要です。以前のバージョンで機能するソリューションは次のとおりです。

private string[] pdfFiles = GetFileNames("C:\\Documents", "*.pdf");

private static string[] GetFileNames(string path, string filter)
{
    string[] files = Directory.GetFiles(path, filter);
    for(int i = 0; i < files.Length; i++)
        files[i] = Path.GetFileName(files[i]);
    return files;
}

こんにちはトーマス、私はこのようなエラーが発生します 'System.Array'には 'Select'の定義が含まれておらず、タイプ 'System.Array'の最初の引数を受け入れる拡張メソッド 'Select'が見つかりませんでした(ディレクティブまたはアセンブリ参照?)他に考慮する必要があるものはありますか?
HelloWorld_Always 2011

using System.Linq;ファイルの先頭に追加し、System.Coreアセンブリがまだ存在しない場合はアセンブリへの参照を追加します。.NET 3.5以降が必要です。必要に応じて.NET2.0のソリューションを投稿します
Thomas Levesque 2011

9

メソッドPath.GetFileName(yourFileName); (MSDN)を使用して、ファイルの名前を取得することができます。


問題は、単一の文字列値の処理ではなく、アイテムのコレクションに関するものです。
ティグラン2011

7

DirectoryInfoクラスとFileInfoクラスを使用できます。

//GetFiles on DirectoryInfo returns a FileInfo object.
var pdfFiles = new DirectoryInfo("C:\\Documents").GetFiles("*.pdf");

//FileInfo has a Name property that only contains the filename part.
var firstPdfFilename = pdfFiles[0].Name;

2
string[] fileEntries = Directory.GetFiles(directoryPath);

foreach (var file_name in fileEntries){
    string fileName = file_name.Substring(directoryPath.Length + 1);
    Console.WriteLine(fileName);
}

3
あなたの答えの説明を教えてください。あなたのソリューションがThomasLevesqueの8年間の回答とどのように大きく異なるかを説明できますか?そして、特に、同じことを行う関数Substringを使用するのではなく、使用する理由をPath、潜在的により堅牢な方法で説明できますか?
ワイク

1

たくさんの方法があります:)

1番目の方法:

string[] folders = Directory.GetDirectories(path, "*", SearchOption.TopDirectoryOnly);
string jsonString = JsonConvert.SerializeObject(folders);

2番目の方法:

string[] folders = new DirectoryInfo(yourPath).GetDirectories().Select(d => d.Name).ToArray();

3番目の方法:

string[] folders = 
    new DirectoryInfo(yourPath).GetDirectories().Select(delegate(DirectoryInfo di)
    {
        return di.Name;
    }).ToArray();

0
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GetNameOfFiles
{
    public class Program
    {
        static void Main(string[] args)
        {
           string[] fileArray = Directory.GetFiles(@"YOUR PATH");
           for (int i = 0; i < fileArray.Length; i++)
           {

               Console.WriteLine(fileArray[i]);
           }
            Console.ReadLine();
        }
    }
}

0

単にlinqを使用できます

Directory.EnumerateFiles(LoanFolder).Select(file => Path.GetFileName(file));

注:コレクション全体が返される前に名前のコレクションの列挙を開始できるため、EnumeratesFilesはDirectory.GetFilesよりも効率的です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.