【问题标题】:C# change file name on DOS wildcardsC# 更改 DOS 通配符上的文件名
【发布时间】:2016-06-21 16:49:33
【问题描述】:

我们有一个 .net 程序,它基本上将文件从一个文件夹复制到另一个文件夹,并且通常在复制过程中更改文件的名称。客户使用 DOS 样式通配符提供要复制的文件名和目标文件名。

例如:

来源:*.log 目标:*.txt

将 aa.log 复制到 aa.txt ,将 bb2.1.log 复制到 bb2.1.txt 等

来源:abc*.csv 目标:KK*_123.csv

将 abcxyz.csv 复制到 KKabcxyz_123.csv,将 abc1722.mm.csv 复制到 KKabc1722.mm_123.csv

如何在 C# 或 VB.net 中实现这种复制/重命名?

File.Copy(SourceFile, TargetFile )不支持文件名中的通配符(*,?),所以问题可能是,如何生成目标文件名?

PS 如果绝对有必要,我可以对源/目标文件名实施一些限制,但我想避免它。

PPS 如有必要,该过程可以分为单独的部分。 示例 #2:来源:abc*.csv 目标:KK*_123.csv

可以替换为
来源:abc*.csv 目标:KK*.csv

和 来源:KK*.csv 目标:*_123.csv

.

【问题讨论】:

  • 如果源是 abc*.csv 而目标是 xyz*_123.csv 那么是否应该将 abcxyz.csv 复制到 xyzxyz_123.csv 而不是 abcxyz_123.csv?
  • 你是对的。我解决了我的问题。实际上,此示例中预期的目标文件名应该是 xyzabcxyz_123.csv.,即它只是在文件名的开头添加“xyz”并在文件扩展名前添加“_123”

标签: c# vb.net wildcard


【解决方案1】:

我不知道有一个完全内置的解决方案,但 .NET 会为您进行模式匹配。 Directory.EnumerateFiles(string, string) 接受一个模式来匹配源文件。你可以做类似的事情

foreach (var sourceFile in Directory.EnumerateFiles(myPath, thePattern))
{
    var targetFile = ApplyPattern(sourceFile, thePattern);
    File.Copy(sourceFile, targetFile);
}

您需要自己实现 ApplyPattern,方法是检查 EnumerateFiles 找到的 sourceFile 并应用占位符逻辑。

也许有一个我不知道的更好的解决方案。如果没有,这至少会为您处理源匹配。

【讨论】:

    猜你喜欢
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多