首页 > 解决方案 > C# 修改 file.txt 时,将副本保存到存档文件夹

问题描述

如何识别文件何时被修改。如果文件被修改,则每次将副本保存到“存档”文件夹。文件名将递增:文件 (1).txt ,文件 (2).txt .....

我下面的代码在 2 上停止递增。

FileInfo fileSettings = new FileInfo(@"c:\path\file.txt");
string archive = @"C:\Users\Desktop\archive\";`

if ( fileSettings.LastWriteTime > DateTime.Today )
{
  int count = 1;
  string woExtension = Path.GetFileNameWithoutExtension(@"c:\path\file.txt");
  string extension = Path.GetExtension(@"c:\path\file.txt");

  string tempFilename = string.Format("{0} ({1})", woExtension, count++);
  fileSettings.CopyTo(Path.Combine(archive + tempFilename + extension));
}

标签: c#filepathcopybackup

解决方案


您似乎需要一种算法来复制文件名适当递增的文件。这将满足您的需求。

假设这些是您的文件和存档目录名称。

var file = @"Data/A.txt";
var archive = @"Data/Archive";

我们查看是否满足最后一次写入时间条件。如果是这样,我们会枚举目标目录中与原始文件模式匹配的所有文件。也就是说,它必须以 开头A,然后它可能有也可能没有(1)等。因此,所有文件,如A.txtA(1).txtA(2).txt都被枚举。然后我们按顺序获取这些文件中的最后一个(这里我们必须小心按长度排序,如果您只是按值排序,A.txt将排在所有其他文件之后)。然后使用 aRegex我们获取最后一个文件的编号、增量,并使用新名称复制文件。

if (File.GetLastWriteTime(file) > DateTime.Today)
{
    var fileNameOnly = Path.GetFileNameWithoutExtension(file);
    var ext = Path.GetExtension(file);
    var pattern = fileNameOnly + "*" + ext;

    var lastCopy = Directory.EnumerateFiles(archive, pattern, System.IO.SearchOption.TopDirectoryOnly)
        .OrderBy(x => x.Length)
        .LastOrDefault();

    var newName = fileNameOnly + ext;
    if (lastCopy != null)
    {
        var lastCopyNameOnly = Path.GetFileNameWithoutExtension(lastCopy);
        var match = Regex.Match(lastCopyNameOnly, @"(.+)\((\d+)\)");
        int lastNum = 1;
        if (match.Success)
        {
            int.TryParse(match.Groups[2].Value, out lastNum);
            lastNum++;
        }
        newName = string.Format("{0}({1}){2}", fileNameOnly, lastNum, ext);
    }

    var dest = Path.Combine(archive, newName);
    File.Copy(file, dest);
}

笔记

还要小心var lastNum = 1;初始化。您必须初始化为1,而不是zero。因为如果match.Success == false,那意味着您只有A.txt目标中的文件,所以您的下一个文件将是A(1).txt. 如果您将其初始化为zero,那么您的下一个文件将A(0).txt不是您想要的输出。


推荐阅读