フォルダーとそのすべてのサブフォルダーを反復処理し、ファイルパスのリストを取得するメソッドがあります。しかし、私はそれを作成してファイルをパブリックリストに追加する方法しか理解できず、リストを返す方法は理解できませんでした。メソッドは次のとおりです。
public List<String> files = new List<String>();
private void DirSearch(string sDir)
{
try
{
foreach (string f in Directory.GetFiles(sDir))
{
files.Add(f);
}
foreach (string d in Directory.GetDirectories(sDir))
{
DirSearch(d);
}
}
catch (System.Exception excpt)
{
MessageBox.Show(excpt.Message);
}
}
そのため、コードのある時点でDirSearch()
を呼び出すだけで、リストにパスが「入力」されますが、それを複数回使用して、異なるディレクトリなどで異なるリストを作成できるようにしたいのです。
private List<String> DirSearch(string sDir)
{
List<String> files = new List<String>();
try
{
foreach (string f in Directory.GetFiles(sDir))
{
files.Add(f);
}
foreach (string d in Directory.GetDirectories(sDir))
{
files.AddRange(DirSearch(d));
}
}
catch (System.Exception excpt)
{
MessageBox.Show(excpt.Message);
}
return files;
}
リスト全体をメモリにロードせず、ブロックを回避したくない場合は、 following answer
をご覧ください。
Directory.GetFiles を使用してメソッドを置き換えることができます。
Directory.GetFiles(dirPath, "*", SearchOption.AllDirectories)
これを使用するだけです:
public static List<String> GetAllFiles(String directory)
{
return Directory.GetFiles(directory, "*.*", SearchOption.AllDirectories).ToList();
}
すべてのファイルが必要な場合は、拡張子のないファイルも含めて:
public static List<String> GetAllFiles(String directory)
{
return Directory.GetFiles(directory, "*", SearchOption.AllDirectories).ToList();
}
次のようなものを使用できます。
string [] filePaths = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
「。」を使用する代わりに、ファイル名を入力するか、「*。txt」などのタイプを入力することもできますSearchOption.AllDirectoriesは、検索するすべてのサブフォルダーは、 here
一時変数ではなくフィールドとして宣言されているfiles
に文字列を追加する理由がわかりません。 DirSearch
の署名を次のように変更できます。
private List<string> DirSearch(string sDir)
そして、catch
ブロックの後に、次を追加します。
return files;
または、メソッド内に一時変数を作成して返すこともできますが、これは私が望むアプローチのようです。そうしないと、そのメソッドを呼び出すたびに、新しく見つかった文字列が以前と同じリストに追加され、重複することになります。
これは、フォルダーとそのサブフォルダー内のすべてのファイルのリストを取得し、テキストドキュメントに保存しようとしている人向けです。以下は、「using」ステートメント、「namespace」、「class」、「methods」などを含む完全なコードです。各部分が何をしているのかを理解できるように、コード全体で可能な限りコメントを付けました。これにより、特定のルートフォルダーのすべてのフォルダーとサブフォルダー内のすべてのファイルのリストを含むテキストドキュメントが作成されます。結局のところ、リスト(Console.WriteLineのように)で何もできなければ、それは良いことです。ここで、「Folder1」という名前のCドライブにフォルダーを作成し、その中に「Folder2」という名前のフォルダーを作成しました。次に、folder2に多数のファイル、フォルダー、およびそれらのフォルダー内のファイルとフォルダーを入力しました。このサンプルコードは、すべてのファイルを取得し、テキストドキュメントにリストを作成し、そのテキストドキュメントをFolder1に配置します。注意:テキストドキュメントをFolder2(読み取り元のフォルダー)に保存しないでください。これは悪い習慣です。常に別のフォルダに保存してください。
これが誰かの助けになることを願っています。
using System;
using System.IO;
namespace ConsoleApplication4
{
class Program
{
public static void Main(string[] args)
{
// Create a header for your text file
string[] HeaderA = { "****** List of Files ******" };
System.IO.File.WriteAllLines(@"c:\Folder1\ListOfFiles.txt", HeaderA);
// Get all files from a folder and all its sub-folders. Here we are getting all files in the folder
// named "Folder2" that is in "Folder1" on the C: drive. Notice the use of the 'forward and back slash'.
string[] arrayA = Directory.GetFiles(@"c:\Folder1/Folder2", "*.*", SearchOption.AllDirectories);
{
//Now that we have a list of files, write them to a text file.
WriteAllLines(@"c:\Folder1\ListOfFiles.txt", arrayA);
}
// Now, append the header and list to the text file.
using (System.IO.StreamWriter file =
new System.IO.StreamWriter(@"c:\Folder1\ListOfFiles.txt"))
{
// First - call the header
foreach (string line in HeaderA)
{
file.WriteLine(line);
}
file.WriteLine(); // This line just puts a blank space between the header and list of files.
// Now, call teh list of files.
foreach (string name in arrayA)
{
file.WriteLine(name);
}
}
}
// These are just the "throw new exception" calls that are needed when converting the array's to strings.
// This one is for the Header.
private static void WriteAllLines(string v, string file)
{
//throw new NotImplementedException();
}
// And this one is for the list of files.
private static void WriteAllLines(string v, string[] arrayA)
{
//throw new NotImplementedException();
}
}
}
String[] allfiles = System.IO.Directory.GetFiles("path/to/dir", "*.*", System.IO.SearchOption.AllDirectories);
これを試して
class Program {static void Main(string [] args){
getfiles get = new getfiles();
List<string> files = get.GetAllFiles(@"D:\Rishi");
foreach(string f in files)
{
Console.WriteLine(f);
}
Console.Read();
}
}
class getfiles
{
public List<string> GetAllFiles(string sDirt)
{
List<string> files = new List<string>();
try
{
foreach (string file in Directory.GetFiles(sDirt))
{
files.Add(file);
}
foreach (string fl in Directory.GetDirectories(sDirt))
{
files.AddRange(GetAllFiles(fl));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return files;
}
}