【发布时间】:2017-08-21 11:04:47
【问题描述】:
我的控制台应用程序 (C#) 可以完美地处理不包含任何 UTF-8 字符的文件名,但是当文件名包含任何 UTF-8 字符时,我的条件 if(!File.Exists(destFilePath)) 不是按预期工作。
我需要删除那些只存在于目标中而不存在于源中的文件。当我的文件名中有一些特殊字符时,例如,
文件
C:\A00000001\20162350775-Étienne Geoffroy Saint-Hilaire,1772-1844 年,一位富有远见的博物学家。 Hervé Le Guyader.pdf
destFilePath
D:\A00000001\20162350775-Étienne Geoffroy Saint-Hilaire,1772-1844 年,一位富有远见的博物学家。 Hervé Le Guyader.pdf
不应删除上述情况下的文件名,因为源和目标文件名相同,但确实如此。但是对于普通文件名,没有问题。我的代码示例如下:
public void SynchronizeSourceAndDestination(string dir)
{
foreach (string file in Directory.GetFiles(dir))
{
string destFilePath = file.Replace(BackupDirectory, LookupDirectory);
if (!File.Exists(destFilePath))
{
// Delete file from Backup
File.Delete(file);
}
}
foreach (string directory in Directory.GetDirectories(dir))
{
string destinationDirectory = directory.Replace(BackupDirectory, LookupDirectory);
if (!Directory.Exists(destinationDirectory))
{
Directory.Delete(directory, true);
continue;
}
SynchronizeSourceAndDestination(directory);
}
}
注意:asp.net Web 应用程序具有设置 globalculture="en-US" uiCulture="en-US" requestEncoding="UTF-8" responseEncoding="UTF-8" fileEncoding="UTF -8" 在 web.config 文件中。以上代码是 C# 控制台应用程序,用于处理 Web 应用程序保存的文件。我本地机器中的文件名没有问题,但是当代码在服务器中时,它不起作用。
【问题讨论】:
-
重命名文件,用 E/e 替换变音符号并再次尝试测试您的假设,该名称不太可能导致问题。请注意,如果服务器上的路径长度超过 ~260 个字符或存在权限问题 Exists() 将返回 false。
-
@Alex K. 长度只有 160 个字符,它给出的问题是因为文件名 É 和 é 中使用了两个字符
-
如果您在 LookupDirectory 上使用
Directory.GetFiles,并从中获取您感兴趣的文件名,然后在其上使用==与file对比,它们是相同的还是不同的? 许多看起来相同的字符实际上是不同的字符。 -
dir的值是多少?BackupDirectory?LookupDirectory?file.Replace(BackupDirectory, LookupDirectory)? -
您的意思是使用
!File.Exists而不是File.Exists?