首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从递归文件夹获取文件信息

从递归文件夹获取文件信息
EN

Stack Overflow用户
提问于 2015-02-21 14:47:36
回答 2查看 1.1K关注 0票数 1

我想做的是从一个文件夹中的每个文件中获取6个文件信息,以及它下面的所有文件夹。这些作品是:

  • 输入(您可以在Access中这样做,它将返回"Microsoft工作表“或"Winzip文件”之类的内容,就像您在资源管理器窗口中看到的那样,但我在C#中没有看到这个属性)
  • FullName
  • 长度
  • CreationTime
  • LastAccessTime
  • LastWriteTime

我有下面的代码,它将列出一个包含path的文件列表,但是我正在努力弄清楚如何在我的输出中获得这个附加信息。如果它可以用分号或别的什么来分隔,那将是很好的,因为最终的愿望是将这个信息写到一个表中。任何帮助都是非常感谢的。

代码语言:javascript
复制
    private void GetMyFiles () {
        string rootDirectory = @"" + txtPathToScan.Text + "";
        string extension = "*";

        List<string> files = GetFilesRecursively (rootDirectory, extension);

        Console.WriteLine ("Got {0} files of extension {1} in directory {2}", files.Count, extension, rootDirectory);
        foreach (string file in files) {
            Console.WriteLine (file);
        }
    }

    /// <summary>
    /// This function calls itself recursively for each of the subdirectories that it finds
    /// in the root directory passed to it. It returns files of the extension as specified
    /// by the caller.
    /// </summary>
    /// <param name="rootDirectory">The directory from which the file list is sought.</param>
    /// <param name="extension">The particular extension for which the file list is sought.</param>
    /// <returns>A list of all the files with extension as specified by the caller. This list
    /// includes the files in the current directory as well its sub-directories.</returns>
    static List<string> GetFilesRecursively (string rootDirectory, string extension) {
        // Uncomment this line only if you want to trace the control as it goes from
        // sub-directory to sub-directory. Be ready for long scrolls of text output:
        //Console.WriteLine ("Currently in directory {0}", rootDirectory);

        // Create an output list:
        List<string> opList = new List<string> ();

        // Get all files in the current directory:
        string[] allFiles = Directory.GetFiles (rootDirectory, "*." + extension);

        // Add these files to the output list:
        opList.AddRange (allFiles);

        // Get all sub-directories in current directory:
        string[] subDirectories = Directory.GetDirectories (rootDirectory);

        // And iterate through them:
        foreach (string subDir in subDirectories) {
            // Get all the files from the sub-directory:
            List<string> subDirFileList = GetFilesRecursively (subDir, extension);
            // And add it to this list:
            opList.AddRange (subDirFileList);
        }

        // Finally return the output list:
        return opList;
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-21 14:56:44

您可以使用FileInfo类获得其中的大多数..。

代码语言:javascript
复制
var info = new System.IO.FileInfo(@"c:\folder\file.ext");

它具有LengthCreationTimeLastAccessTimeLastWriteTime的属性,要将它们输出(例如)到控制台,您可以.

代码语言:javascript
复制
Console.WriteLine("For file {0}", info.Name);
Console.WriteLine("Length is {0}", info.Length);
Console.WriteLine("Creation time is {0}", info.CreationTime);
Console.WriteLine("Last access time is {0}", info.LastAccessTime);
Console.WriteLine("Last write time is {0}", info.LastWriteTime);

要获得完整的文件名,可以使用GetFileNameWithoutExtension

代码语言:javascript
复制
var fileName = System.IO.Path.GetFileNameWithoutExtension(@"c:\folder\file.ext")

在上面的示例中,filename将等于"file"

获取文件扩展名的描述需要更多的工作,但可以使用SHGetFIleInfo完成,有关详细信息,请参阅this answer

要将此与当前代码集成(如果您不太担心文件描述),可以更改GetFilesRecursively方法以返回List<FileInfo>.

代码语言:javascript
复制
static List<FileInfo> GetFilesRecursively (string rootDirectory, string extension)

相应地更新您的opList变量。

代码语言:javascript
复制
List<FileInfo> opList = new List<FileInfo> ();

然后调整AddRange调用以添加FileInfo对象..。

代码语言:javascript
复制
opList.AddRange (allFiles.Select(f => new FileInfo(f)));

最后,还需要更改subDirFileList的类型,因此需要更改List<FileInfo>

(我想这就是一切!)

票数 1
EN

Stack Overflow用户

发布于 2015-02-21 16:41:30

对于后人,完整的答案如下。如果你要投票支持理查德的答案,请只投的票。谢谢!

代码语言:javascript
复制
    private void GetMyFiles () {
        string rootDirectory = @"" + txtPathToScan.Text + "";
        string extension = "*";

        List<FileInfo> files = GetFilesRecursively (rootDirectory, extension);

        Console.WriteLine ("Got {0} files of extension {1} in directory {2}", files.Count, extension, rootDirectory);
        foreach (FileInfo file in files)
        {
            Console.WriteLine(file);
            var info = new System.IO.FileInfo(@"" + file + "");

            Console.WriteLine("For file {0}", info.Name);
            Console.WriteLine("Length is {0} KB", info.Length/1024);
            Console.WriteLine("Creation time is {0}", info.CreationTime);
            Console.WriteLine("Last access time is {0}", info.LastAccessTime);
            Console.WriteLine("Last write time is {0}", info.LastWriteTime);

        }
    }

    /// <summary>
    /// This function calls itself recursively for each of the subdirectories that it finds
    /// in the root directory passed to it. It returns files of the extension as specified
    /// by the caller.
    /// </summary>
    /// <param name="rootDirectory">The directory from which the file list is sought.</param>
    /// <param name="extension">The particular extension for which the file list is sought.</param>
    /// <returns>A list of all the files with extension as specified by the caller. This list
    /// includes the files in the current directory as well its sub-directories.</returns>
    static List<FileInfo> GetFilesRecursively(string rootDirectory, string extension)
    {
        // Uncomment this line only if you want to trace the control as it goes from
        // sub-directory to sub-directory. Be ready for long scrolls of text output:
        //Console.WriteLine ("Currently in directory {0}", rootDirectory);

        // Create an output list:
        List<FileInfo> opList = new List<FileInfo>();

        // Get all files in the current directory:
        string[] allFiles = Directory.GetFiles (rootDirectory, "*." + extension);

        // Add these files to the output list:
        opList.AddRange(allFiles.Select(f => new FileInfo(f)));

        // Get all sub-directories in current directory:
        string[] subDirectories = Directory.GetDirectories (rootDirectory);

        // And iterate through them:
        foreach (string subDir in subDirectories) {
            // Get all the files from the sub-directory:
            List<FileInfo> subDirFileList = GetFilesRecursively (subDir, extension);
            // And add it to this list:
            opList.AddRange (subDirFileList);
        }

        // Finally return the output list:
        return opList;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28647079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档