【问题标题】:C# When file.txt is modified save a copy to archive folderC# 修改 file.txt 时,将副本保存到存档文件夹
【发布时间】:2020-02-07 03:20:02
【问题描述】:

如何识别文件何时被修改。如果文件被修改,则每次将副本保存到“存档”文件夹。文件名会递增:file (1).txt , file (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));
}

【问题讨论】:

  • 我建议看看我们的help center。在那里,它解释了为什么这个问题对 StackOverflow 来说不是一个好问题。你已经证明你没有自己做任何研究或尝试,这是 StackOverflow 的重要组成部分。如果没有可帮助的代码,我们如何帮助您编写代码?如果你有代码,请分享!
  • 这缺少关键信息。什么时候改的?自上次阅读以来?

标签: c# file path copy backup


【解决方案1】:

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

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

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

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

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,这不是您想要的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    相关资源
    最近更新 更多