1

现在我正在尝试截取屏幕截图并将其保存到本地计算机,然后将其复制到网络驱动器:

问:\1234567890123456789012345\123456789012\12345\截图\sc.jpg

^ 了解有多少个角色在说话。我已经设置为在“12345”之后创建一个屏幕截图文件夹当程序到达这一点时,会发生此错误:

在此处输入图像描述

我怎样才能避免这种情况?

还:

DirectoryInfo scdestinfo = new DirectoryInfo(scdest);
DirectoryInfo scinfo = new DirectoryInfo(sccpath);
CopyAll(scinfo, scdestinfo);

这是我复制文件夹/文件的代码。

public void CopyAll(DirectoryInfo source, DirectoryInfo target)
    {
        copyall = false;
        try
        {
            //check if the target directory exists
            if (Directory.Exists(target.FullName) == false)
            {
                Directory.CreateDirectory(target.FullName);
            }//end if
            //copy all the files into the new directory
            foreach (FileInfo fi in source.GetFiles())
            {
                fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
            }//end foreach
            //copy all the sub directories using recursion
            foreach (DirectoryInfo diSourceDir in source.GetDirectories())
            {
                DirectoryInfo nextTargetDir = target.CreateSubdirectory(diSourceDir.Name);
                CopyAll(diSourceDir, nextTargetDir);
            }//end foreach
            //success here
            copyall = true;    
        }//end try
        catch (IOException ie)
        {
            MessageBox.Show(ie.Message);
            //handle it here
            copyall = false;
        }//end catch
    }//end CopyAll

和copyall功能。

4

2 回答 2

2

不幸的是,没有直接的方法可以避免这种情况。

解决方案1:最自然的一个:以不超过该限制的方式生成路径。(较短的目录和文件名),或者只是重新组织目录布局,如果可能的话。

解决方案2:不喜欢这个(有线,imo),但可以使用WindowsAPI,在这种情况下不会失败,例如来自.NET 2.0 Workaround for PathTooLongException(适用于 2.0,但现在有效)

解决方案3。尝试,当您要读取/写入数据到文件时,将操作系统光标移动到该目录,因此您无需指定完整(260+)即可访问它,而只需指定文件名。你应该试试这个,看看它是否适合你。(即使这可行,我更喜欢第一个解决方案,但值得尝试)

希望这可以帮助。

于 2012-04-13T17:58:29.570 回答
2

这是一个Windows 限制,尽管有许多 API 函数的 Unicode 变体允许最大路径长度约为 32,767 个字符,但这又受到您正在处理的特定文件系统的限制。通常,给定路径组件限制为 255 个字符(检查GetVolumeInformation以了解给定卷的特定限制)。

要使用允许更长路径的 Unicode 变体(例如CreateFileW),我相信您将不得不直接处理 Windows API,而不是使用 .Net 库函数。

于 2012-04-13T17:58:36.063 回答