c# - 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));
}
解决方案
您似乎需要一种算法来复制文件名适当递增的文件。这将满足您的需求。
假设这些是您的文件和存档目录名称。
var file = @"Data/A.txt";
var archive = @"Data/Archive";
我们查看是否满足最后一次写入时间条件。如果是这样,我们会枚举目标目录中与原始文件模式匹配的所有文件。也就是说,它必须以 开头A
,然后它可能有也可能没有(1)
等。因此,所有文件,如A.txt
,A(1).txt
,A(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
不是您想要的输出。
推荐阅读
- mysql - 从一个表中选择多个列,从另一个表中获取相应的详细信息并将它们插入到另一个表中
- nopcommerce - 在退出 nop commerce 视图中添加新输入,并在 nop commerce 4.2 中为 DB 中的输入创建数据库
- swift - 没有使用 pod swift 5 的模块“SDWebImage”
- javascript - jquery append 删除和追加
- python - 在开发 Django 项目时,Docker 是“virtualenv”的替代品吗?
- javascript - 从 Arduino WebSocket sendBIN 获取数据到 Javascript 作为 Blob
- amazon-web-services - 无法从 docker 容器访问 aws s3。被拒绝
- python - 从模型传递参数
- scala - 如何将scala数据框的每一行映射到新模式
- java - 为什么 ('1'+'1') 在 Java 中输出 98?