我们经常遇到这个问题......
例:
如果我有一个文件,我想将它复制到另一个目录或UNC共享,如果路径的长度超过248(如果我没有记错),那么它会抛出PathTooLongException.这个问题有解决方法吗?
PS:是否有任何注册表设置将此路径设置为更长的字符集?
我试图在Windows上将长文件名转换为短文件名(8.3).
带有命令行参数的批处理文件按预期工作:
short.bat:
@echo OFF
echo %~s1
Run Code Online (Sandbox Code Playgroud)
调用short.bat C:\Documents and Settings\User\NTUSER.DAT返回C:\DOCUM~1\USER\NTUSER.DAT
但是,我不喜欢为此添加额外的.bat文件.我宁愿cmd.exe用ruby脚本调用整个命令.我怎样才能做到这一点?
作为中间步骤,我尝试对批处理文件中的路径进行硬编码,但这不起作用:
short1.bat:
@echo OFF
SET filename="C:\Documents and Settings\User\NTUSER.DAT"
echo %filename%
echo %~sfilename%
Run Code Online (Sandbox Code Playgroud)
echo %filename%有效,但echo %~sfilename%出现以下错误:
The following usage of the path operator in batch-parameter
substitution is invalid: %~sfilename%
For valid formats type CALL /? or FOR /?
Run Code Online (Sandbox Code Playgroud)
如果short1.bat工作,我如何将其转换为可以调用的单行cmd.exe \c ...?
还有另一个问题(如何获取DOS路径而不是Windows路径),但是那个问题是专门询问当前目录的路径.
windows command-line batch-file long-filenames short-filenames
当我递归一些文件夹和文件时,我遇到这个错误:
指定的路径,文件名或两者都太长.完全限定的文件名必须少于260个字符,目录名必须少于248个字符.
这是我的功能
private void ProcessDirectory(DirectoryInfo di)
{
try
{
DirectoryInfo[] diArr = di.GetDirectories();
foreach (DirectoryInfo directoryInfo in diArr)
{
if (StopCheck)
return;
ProcessDirectory(directoryInfo);
}
ProcessFile(di);
}
catch (Exception e)
{
listBoxError.Items.Add(e.Message);
}
TextBoxCurrentFolder.Text = di.ToString();
}
Run Code Online (Sandbox Code Playgroud)
我不能让目录名更短,因为我不允许这样......我怎么能解决这个问题呢?
补充: 这是另一个功能:
private void ProcessFile(DirectoryInfo di)
{
try
{
FileInfo[] fileInfo = di.GetFiles();
if (fileInfo.LongLength != 0)
{
foreach (FileInfo info in fileInfo)
{
Size += info.Length;
CountFile++;
}
}
}
catch (Exception e)
{
listBoxError.Items.Add(e.Message);
}
}
Run Code Online (Sandbox Code Playgroud)
EDIT 在他使用Zeta Long Paths的地方找到了这个: …
PathTooLongException当我访问对象的Fullname属性时,我的硬盘驱动器上有文件FileSystemInfo.有没有办法解决这个问题(不包括重命名不是一个选项的文件)?
其他答案提到的http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx#maxpath建议在文件名上加上"\?\"前缀但在这种情况下DirectoryInfo.GetFileSystemInfos()是负责创建FileSystemInfo对象,DirectoryInfo不接受该前缀,因此无法使用它.
答案" C#代码中的PathTooLongException "没有帮助,因为这是一个多线程应用程序,我无法继续更改当前的应用程序路径.
我是否真的必须做所有事情PInvoke才能读取硬盘上的每个文件?