!对于包含UTF-8字符的文件名,File.Exists无法正常工作

时间:2017-08-21 11:04:47

标签: c# .net

我的控制台应用程序(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应用程序保存的文件。本地计算机中的文件名没有问题,但是当代码在服务器中时,它不起作用。

2 个答案:

答案 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);
            }
        }
    }
}

确保系统中存在A00000001A00000002文件夹,并将文件放在两个文件夹中,并使用相同的名称和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字符。我认为这是因为文件创建者直接对字符进行了一些复制和粘贴。