我的控制台应用程序(C#)完全适用于不包含任何UTF-8字符的文件名,但是当文件名包含任何UTF-8字符时,我的条件if(!File.Exists(destFilePath))不是按预期工作。
我需要删除那些仅存在于目标但不存在于源中的文件。当我的文件名中有一些特殊字符时,例如
文件
C:\ A00000001 \ 20162350775-ÉtienneGeoffroySaint-Hilaire,1772-1844一位富有远见的博物学家。 HervéLeGuyader.pdf
destFilePath
D:\ A00000001 \ 20162350775-ÉtienneGeoffroySaint-Hilaire,1772-1844一位富有远见的博物学家。 HervéLeGuyader.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应用程序具有设置globalization culture =“en-US”uiCulture =“en-US”requestEncoding =“UTF-8”responseEncoding =“UTF-8”fileEncoding =“UTF -8“在web.config文件中。上面的代码是C#console应用程序,用于处理Web应用程序保存的文件。本地计算机中的文件名没有问题,但是当代码在服务器中时,它不起作用。
答案 0 :(得分:2)
它可能与文件路径的长度有关(> 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。
- edit-- 为了完成下面的评论,我已经创建了这个控制台应用程序进行测试。
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);
}
}
}
}
确保系统中存在A00000001
和A00000002
文件夹,并将文件放在两个文件夹中,并使用相同的名称和UTF-8字符(20162350775-Étienne Geoffroy Saint-Hilaire, 1772-1844 a visionary naturalist. Hervé Le Guyader.pdf
)。
就我而言,由于File.Exists
检查,没有文件被删除。
答案 1 :(得分:0)
为了使我的解决方案可行,我按É(Alt + 144),é(Alt + 130)更改了扩展的ASCII字符。我认为这是因为文件创建者直接对字符进行了一些复制和粘贴。