!File.Exists 对于包含 UTF-8 字符的文件名未按预期工作



我的控制台应用程序 (C#( 非常适合不包含任何 UTF-8 字符的文件名,但是当文件名包含任何 UTF-8 字符时,我的条件 if(!File.Exists(destFilePath(( 未按预期工作。

我需要删除那些只存在于目标中而不存在于源中的文件。例如,当我的文件名中有一些特殊字符时,

文件

C:\A00000001\20162350775-艾蒂安·杰弗鲁瓦·圣伊莱尔,1772-1844 年,一位有远见的自然主义者。埃尔韦·勒·圭亚德尔.pdf

dest文件路径

D:\A00000001\20162350775-艾蒂安·杰弗鲁瓦·圣伊莱尔,1772-1844 年,一位有远见的自然主义者。埃尔韦·勒·圭亚德尔.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 应用程序在 web.config 文件中设置了全球化区域性="en-US" uiCulture="en-US" 请求编码="UTF-8" 响应编码="UTF-8" 文件编码="UTF-8"。上面的代码是C#控制台应用程序,用于处理Web应用程序保存的文件。我的本地机器中的文件名没有问题,但是当代码在服务器中时,它不起作用。

它可能与文件路径的长度(>260 个字符(有关,因为File.Exists确实可以使用 UTF-8 字符。

几分钟前,我已经用 csi.exe 对其进行了测试,这是输出:

C:Temp>csi
Microsoft (R) Visual C# Interactive Compiler version 2.2.0.61624
Copyright (C) Microsoft Corporation. All rights reserved.
Type "#help" for more information.
> System.IO.File.Exists("C:\A00000001\20162350775-Étienne Geoffroy Saint-Hilai
re, 1772-1844 a visionary naturalist. Hervé Le Guyader.pdf")
true
>

如您所见,结果是true.我已经在荷兰语的Windows 10机器上对此进行了测试,并安装了VS2017.2。

--编辑-- 为了完成下面的评论,我创建了这个控制台应用程序进行测试。

using System.IO;
namespace ConsoleApp1
{
class Program
{
private const string BackupDirectory = "C:\A00000001\";
private const string LookupDirectory = "C:\A00000002\";
static void Main(string[] args)
{
SynchronizeSourceAndDestination("C:\A00000001\");
}
public static 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);
}
}
}
}

确保系统上存在A00000001A00000002文件夹,并在它们内部放置一个具有相同名称和 UTF-8 字符 (20162350775-Étienne Geoffroy Saint-Hilaire, 1772-1844 a visionary naturalist. Hervé Le Guyader.pdf( 的文件。

就我而言,由于File.Exists检查,没有文件被删除。

为了使我的解决方案可行,我通过按 É (Alt +144(、é (Alt +130(更改了扩展的 ASCII 字符。我认为这是因为文件创建者直接对字符进行了一些复制和粘贴。

我认为你的角色可能是两个角色。一个正常的 E,后跟一个组合变音符号。它只是看起来像单个字符,但在字符串本身中它是两个字符。

https://www.compart.com/en/unicode/block/U+0300

最新更新