1

我正在使用 C# 2010 创建一个应用程序,其目的是复制具有指定扩展名的文件。它使用 .NET Framework 3.5 。

我有以下代码:

    private void GetFiles()
    {
        bool validext;
        foreach (string filePath in Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories))
        {
            //Check if the file has a specified extension
            validext = false;
            foreach (string extension in ext)
                if (HasExtension(filePath, extension))
                {
                    validext = true;
                    break;
                }

            if ((validext && mode == 1) || (!validext && mode == 2))
            {
                Directory.CreateDirectory(Path.GetDirectoryName(filePath));
                to_copy.Add(filePath);
            }
        }
        totalcount = to_copy.Count;
    }

问题出在这个命令上:

Directory.CreateDirectory(TrimFile(filePath));

它不会引发任何异常,它应该创建的目录路径是有效的,并且应用程序以管理员权限运行。然而,该目录并未创建。搜索互联网并没有给我任何答案,所以我的问题是:

为什么Directory.CreateDirectory(TrimFile(filePath));不工作?

编辑:我已将 FileTrim 函数替换为Path.GetDirectoryName(filePath).

4

2 回答 2

4

让我们“调试”代码

private void GetFiles()
{
    //1. Lets say SourcePath = "C:\some\kind\of\directory\"
    foreach (string filePath in Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories))
    {
        //2. Lets say we have file filePath = "C:\some\kind\of\directory\file.txt"

        //.. all validation

        //3. At this point Path.GetDirectoryName("C:\some\kind\of\directory\file.txt")
        //   returns "C:\some\kind\of\directory\"
        //4. Lets create that directory...but wait its already exist and contains some files! 
        //   Why create what already exists?
        Directory.CreateDirectory(Path.GetDirectoryName(filePath));
        to_copy.Add(filePath);
    }
}

所以事实是您的 CreateDirectory 调用是无用的,因为您已经遍历目录中的现有文件。除非您想在所有目录中创建新的子目录“Temp”,否则您需要这样做:

Directory.CreateDirectory(Path.Combine(Path.GetDirectoryName(filePath), "Temp"));

之后,您将C:\some\kind\of\directory\Temp创建目录。

要将文件复制到其他目录,您需要执行以下操作:

string directoryToCopyFiles = @"C:\My\directory\of\file\copies";
if(!Directory.Exists(directoryToCopyFiles))
   Directory.CreateDirectory(directoryToCopyFiles);

File.Copy(Path.Combine(directoryToCopyFiles, Path.GetFileName(filePath)), filePath);

如果该目录C:\My\directory\of\file\copies之前不存在,则将创建该目录,并将具有相同名称的文件复制到该目录。

于 2012-05-24T11:28:32.140 回答
1

我最近也陷入了这个困境,我很傻,我没有具体化正确的路径,所以它正在创建我具体化的目录......VSProjects/ProjectName/bin/Debug/:'D

前:

if (!Directory.Exists(Path.GetDirectoryName(properties.ApiConfigRoute)))
      Directory.CreateDirectory("ConfigFolder");

后:

if (!Directory.Exists(Path.GetDirectoryName(properties.ApiConfigRoute)))
      Directory.CreateDirectory(Path.GetDirectoryName(properties.ApiConfigRoute));

嗬!希望能帮助到你。只要确保您使用绝对路线创建它。

于 2017-05-17T07:10:52.970 回答