将相对路径包含在文件数组中的最佳方法

Best way to include relative path with file array

我是 C# 的新手,需要有关如何处理问题的建议:

我正在编写代码来同步文件夹。要确定两个文件是否是同一个文件,我需要比较它们的相对路径(它们的基本目录和文件名中的子文件夹)。我用以下代码创建了一个 FileInfo 数组:

for (int y = 1; y <= nf; y++)
            {
                this.Title = "Folder Sync - Getting files from folder " + y;
                DirectoryInfo basedir = new DirectoryInfo(dirs[y]);
                dirf[y] = basedir.GetFiles("*", SearchOption.AllDirectories).OrderBy(item => item.FullName).ToArray();
            }

但是,FileInfo Class 没有 RelativePath 属性。以下是我考虑过的选项: 1. 创建一个单独的字符串数组,其中仅包含每个文件的相对路径 file.FullName.Substring(basedir.FullName.Length)

  1. 每次需要时都计算相对路径
  2. 将 FileInfo 对象和 RelativePath 字符串都放入一个对象数组中
  3. 扩展 FileInfo 属性(显然不适用于当前的 C#)
  4. 使用相对路径 field/property 创建派生的 class myFile 信息。在制作 myFileInfo 数组时用相对路径填充它。

我刚试了 5,但是 运行 进入了错误 "Cannot implicitly convert FileInfo[] to myFileInfo[]"。在阅读了构造函数以尝试解决此问题后,我决定退后一步,问问这是否是正确的方法。

那么,一般性问题:处理此问题的最佳实践方法是什么? 具体问题:如何为每个文件包含 RelativePath?

我认为 5 非常接近我认为的 "standard approach"。

标准方法是为您的应用程序创建代表 "file" 的 class 并在其中添加信息。可能 class 会 包含 相对 path/absolute path/base 路径、最后修改时间、散列。避免直接使用 FileInfo 会简化同步代码的单元测试。

在您建议的其他方法中,2(按需计算)看起来很合理,因为您使用 FileInfo 作为事实来源。

创建多个并行数组来表示单个对象列表通常是不好的做法 - 很难保持同步和测试。

我想我只需创建一个新对象,其中包含一个 FileInfo 成员和一个用于 relativepath 成员的字符串。我不会尝试从任何东西中推导出 class,它并没有真正给你带来任何好处,只会增加复杂性。