1

&my.exeから始まる名前の最初のファイルへのパスを見つけ、必要に応じて深くする必要がある状況があります。 実際には適していますが、WinAPI から可能なように、最初のファイルが見つかったら検索を停止する必要があります。startingdirectory\mydir\
IO.Directory.GetFilesFindFirstFile

VB.NET

Dim findedDirectories() As String = IO.Directory.GetFiles( _
startingdirectory & "\mydir\", "my.exe", IO.SearchOption.AllDirectories)

C#

string[] findedDirectories = IO.Directory.GetFiles( _
startingdirectory + "\\mydir\\", "my.exe", IO.SearchOption.AllDirectories);

関数の結果がではなくstringまたはになるように、最初のファイルが見つかった後に検索を停止することはできますか? または、サブディレクトリで最初のファイルを検索するより良い方法はありますか?empty stringstring array

4

2 に答える 2

4

次のような解決策が役立ちます。

/// <summary>
/// Searches for the first file matching to searchPattern in the sepcified path.
/// </summary>
/// <param name="path">The path from where to start the search.</param>
/// <param name="searchPattern">The pattern for which files to search for.</param>
/// <returns>Either the complete path including filename of the first file found
/// or string.Empty if no matching file could be found.</returns>
public static string FindFirstFile(string path, string searchPattern)
{
    string[] files;

    try
    {
        // Exception could occur due to insufficient permission.
        files = Directory.GetFiles(path, searchPattern, SearchOption.TopDirectoryOnly);
    }
    catch (Exception)
    {
        return string.Empty;
    }

    // If matching files have been found, return the first one.
    if (files.Length > 0)
    {
        return files[0];
    }
    else
    {
        // Otherwise find all directories.
        string[] directories;

        try
        {
            // Exception could occur due to insufficient permission.
            directories = Directory.GetDirectories(path);
        }
        catch (Exception)
        {
            return string.Empty;
        }

        // Iterate through each directory and call the method recursivly.
        foreach (string directory in directories)
        {
            string file = FindFirstFile(directory, searchPattern);

            // If we found a file, return it (and break the recursion).
            if (file != string.Empty)
            {
                return file;
            }
        }
    }

    // If no file was found (neither in this directory nor in the child directories)
    // simply return string.Empty.
    return string.Empty;
}
于 2013-11-01T15:07:24.870 に答える
2

Directory.GetDirectories最も簡単な方法は、再帰を自分でサブディレクトリに整理して、 passへの再帰呼び出しを行うことだと思いますSearchOption.TopDirectoryOnly。各ディレクトリで、ファイルの存在を確認しますFile.Exists

これは実際に、Win32 でFindFirstFile. を使用するときは、サブディレクトリの再帰をFindFirstFile自分で実装する必要があります。FindFirstFileSearchOption.AllDirectories

于 2013-11-01T14:15:23.087 に答える