生成具有相对路径的目录中的文件列表

本文关键字:文件 列表 路径 相对 | 更新日期: 2023-09-27 18:33:46

所以,我正在制作一个小应用程序,它从命令行参数生成文件夹(递归)内的文件列表。我希望它生成具有相对路径的文件列表,以便以后可以使用它们。像参数文件夹这样的命令是 c:/folder,所以我想获取文件夹内的所有内容,不包括文件夹本身。

这就是我现在得到的

c:/folder'some.exe  
c:/folder'locales'en.pak  
c:/folder'logs'client_2016.log

这就是我想要的。

some.exe  
locales'en.pak  
logs'client_2016.log

法典

public static void ProcessDirectory(string targetDirectory)
    {
        // Process the list of files
        string[] fileEntries = Directory.GetFiles(targetDirectory);
        Parallel.ForEach(fileEntries, fileEntry =>
        {
            ProcessFile(fileEntry);
        });
        // Recurse into subdirectories
        string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
        Parallel.ForEach(subdirectoryEntries, subdirectoryEntry =>
        {
            ProcessDirectory(subdirectoryEntry);
        });
    }
    public static void ProcessFile(string path)
    {
        //string output = path.Replace(Environment.GetCommandLineArgs, ""); Something like this maybe?
        //Console.WriteLine(output);
        Console.WriteLine(path);
    }

生成具有相对路径的目录中的文件列表

你不需要自己处理递归;你可以使用Directory.EnumerateFiles()的重载,它需要一个SearchOption参数。

前提是您的根以驱动器号或''开头,您可以像这样做您想做的事:

string root = @"D:'Test'";
var files = Directory.EnumerateFiles(root, "*", SearchOption.AllDirectories)
    .Select(path => path.Replace(root, ""));
// Now files contains all the file names you want, with the root removed.
Console.WriteLine(string.Join("'n", files));

请注意,在枚举文件条目之前,不会提取它们。您可以将它们全部放在一个列表中,如下所示:

var listOfFiles = files.ToList();

或者,您可以使用foreach来迭代它们,而无需先将它们放在列表中。

foreach (var file in files)
{
    // Do something with file.
}

将初始目录传递给您的方法?

public static void ProcessDirectory(string targetDirectory)
{
    ProcessDirectory(targetDirectory, targetDirectory);
}   
public static void ProcessDirectory(string targetDirectory, string pathToRemove)
{
    // Process the list of files
    string[] fileEntries = Directory.GetFiles(targetDirectory);
    Parallel.ForEach(fileEntries, fileEntry =>
    {
         ProcessFile(fileEntry, pathToRemove);
    });
    // Recurse into subdirectories
    string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
    Parallel.ForEach(subdirectoryEntries, subdirectoryEntry =>
    {
        ProcessDirectory(subdirectoryEntry, pathToRemove);
    });
}
public static void ProcessFile(string path, string pathToRemove)
{
    Console.WriteLine(path.Replace(pathToRemove,""));
}

像这样的东西?

var files = GetFiles(@"C:/tmp/", @"C:/tmp/");
return;
 public static List<string> GetFiles(string path, string basePath)
    {
      var files = System.IO.Directory.GetFiles(path).ToList().Select(m => m.Replace(basePath, "")).ToList();
      foreach (var directory in System.IO.Directory.GetDirectories(path))
      {
        files.AddRange(GetFiles(directory, basePath));
      }
      return files.Select(m => m.Replace(basePath, "")).ToList();
    }