我在XP Windows脚本中使用xcopy来递归复制目录.我不断收到"Insufficient Memory"错误,我理解这是因为我试图复制的文件路径太长了.我可以轻松地减少路径长度,但不幸的是我无法确定哪些文件违反了路径长度限制.复制的文件将打印到标准输出(我将其重定向到日志文件),但错误消息将打印到终端,因此我甚至无法计算出哪个目录正在给出错误.
刚做了一个有趣的案例.
我的软件报告了由于路径长于MAX_PATH而导致的故障.
该路径只是我的文档中的一个普通旧文档,例如:
C:\Documents and Settings\Bill\Some Stupid FOlder Name\A really ridiculously long file thats really very very very..........very long.pdf
Run Code Online (Sandbox Code Playgroud)
总长度为269个字符(MAX_PATH == 260).
用户没有使用外部硬盘或类似的东西.这是Windows托管驱动器上的文件.
所以我的问题是这个.我应该关心吗?
我不是说可以我对付长的路径,我问应该 I.是的,我知道一些的Win32 API的"\?\"的Unicode劈,但似乎这个技巧是不是没有风险(如它正在改变API解析路径的行为方式),并且所有API都不支持.
所以,无论如何,让我只说出我的立场/断言:
基本上,人们可以这样看待它:一个胭脂工具允许用户创建一个许多Windows无法访问的文件(例如Explorer).我可以认为我不应该处理这个问题.
(顺便说一下,这不是对最短路径长度的批准投票:我认为260个字符是一个笑话,我只是说如果Windows shell和一些API无法处理> 260那么我为什么要这样做?).
那么,这是一个公平的观点吗?我应该说"不是我的问题"吗?
更新:刚刚让另一个用户遇到同样的问题.这次是一个mp3文件.我错过了什么吗?这些用户如何创建违反MAX_PATH规则的文件?
我想使用Boost.Filesystem库来操作路径,文件和目录.我的问题是支持的路径长于MAX_PATH吗?
我知道在Win32API中我们有解决方法"\\?\"但是PathAppend和PathCombine等基本功能不支持它.
所以我正在寻找有关MAX_PATH和Boost.FS的任何有用信息.
谢谢
UPD:我关心路径追加,路径组合等所有操作(我在Win32API中有这些功能,但它们不适用于长于MAX_PATH的路径)例如,CreateFileW和DeleteFileW都支持比MAX_PATH更长的路径.May Boost.FS可以替代Win32API实用程序函数,例如shlwapi和shell32中的函数,它们通常不支持长路径
我发现ASP.NET的一个问题,我知道至少已经让另外一个人难过了.我们试图使用HttpModule来处理Web应用程序的通配符请求.生成的url是动态的,可能长达数百个字符.不幸的是,aspnet_isapi.dll文件中似乎存在一个限制,它将url中路径的长度限制为MAX_PATH,其中硬编码为260个字符.
有没有其他人遇到这个并找到了解决这个限制的方法?查询字符串参数不是一个选项.
谢谢,格雷格巴拉德
我正在使用.iss
脚本在Inno Setup Compiler中构建一个exe文件.我需要将一些node_modules打包到这个应用程序中,所以我有一行看起来像这样:[Files]
Source: "{#SourcePath}Encore.Warehouse.UI\bin\Warehouse_Release\warehouse\*"; \
DestDir: "{app}\warehouse"; Flags: ignoreversion recursesubdirs createallsubdirs
Run Code Online (Sandbox Code Playgroud)
编译时,我收到此错误:
这是编译器输出:
所以,它似乎运行正常,直到它中止.我最初的想法是,browser.js
它不存在,但经过双重检查,情况并非如此.此外,我在源路径中使用通配符,因此编译器知道该文件存在,但似乎在压缩它时遇到问题.
另一个可能导致问题的是文件路径长度.由于嵌套依赖性,节点模块通常最终会出现荒谬的文件路径长度.在这种情况下,路径长度为260.假设这是造成问题的原因,有什么方法可以绕过它吗?
背景
我需要编写一个使用.NET 2.0版本的工具(由于政治,商业和机密性/信任原因,使用现成的东西不是这个客户的选项)通过网络将文件从一个服务器迁移到另一个服务器.服务器是本地团队的文件服务器,某些团队文件夹需要迁移到其他服务器以便于重组.基本的想法是我们读取每个文件并在数小时内通过网络流式传输,几天后数据将被迁移.需要保留文件权限.由于这将花费几天时间(我们正在谈论几千兆字节的数据,对于某些团队而言),我们需要每晚迭代文件并比较修改日期并更新已更改的日期.理论上说,最终新服务器将拥有最新的文件副本,用户可以切换到新服务器.它当然不是那么简单,但我们有一个我们认为应该工作的设计:)
问题
所以理论上我们只需打开文件,通过网络流式传输,然后在另一端写入,对吧?:)
不幸的是,在服务器本身,文件共享是在文件夹路径创建的,例如:
D:\ Data\Team Shares\DIVISION\DEPARTMENT\NAME OF TEAM - 可能会长期一直
对于每个用户,此路径将映射到驱动器,例如,它将作为\\ SERVER\TEAMNAME共享并映射到T:驱动器.
这导致了从T:驱动器可见的文件在MAX_PATH
限制范围内的情况,但是当在服务器本身上本地查看时,它们会超出它.我们无法使用网络共享来访问文件,因为这个工具需要是通用的,要在数百个这样的服务器上运行,并且没有标准的方法来判断哪些文件共享是我们应该移动的文件共享和那些不是 - 甚至没有命名约定标准.此外,偶尔会有其他股份的子股票,因此我们超过MAX_PATH
限额两倍!
我知道使用"\\?\"前缀指定路径的解决方法,该路径将路径视为UNC路径,并允许理论上最多32k个字符.
这种解决方法是在Win32 API级别实现的,System.IO命名空间(大部分)基本上只是本机Win32 API函数的一个薄包装,但是在将调用交给API之前,Microsoft已经"帮助"实现了额外(不正确)的验证. .在这种情况下,.NET Framework拒绝该路径,因为它声称'?' 是一个无效的路径字符.
所以我的问题是......有没有一种方法我没有想到这将允许我解决这个问题,而不必完全重写几乎整个System.IO命名空间,加载P/Invoke调用,只是为了删除这个烦人的验证?
我正在寻找在Windows应用程序中处理更长的文件路径.
目前,我有一个文本框(编辑框),用户可以在其中键入绝对文件路径.然后,我将这个类型化的文件路径读GetWindowText
入一个声明如下的字符串:TCHAR FilePath[MAX_PATH];
显然,在这里,我依靠的是MAX_PATH
常数,这限制了我的260个字符.因此,为了处理更长的文件/路径名称,我可以像这样扩展我的TCHAR数组:TCHAR FilePath[32767];
.
或者,还有更好的方法?我可以使用可变长度数组吗?(TCHAR FilePath[];
这在C++中是否可能? - 对不起,我对此很新).
先谢谢你!
这是我上面提到的整个代码片段:
TCHAR FilePath[MAX_PATH];
ZeroMemory(&FilePath, sizeof(FilePath));
GetWindowText(hWndFilePath, FilePath, MAX_PATH);
Run Code Online (Sandbox Code Playgroud) 我知道WinRT中的文件系统访问是不同的(读取:隔离),但我很好奇我们是否还要担心MAX_PATH,还是避免了这种限制?
出于测试目的,我想在磁盘上创建一个超过Windows MAX_PATH限制的目录.我怎样才能做到这一点?
(我尝试过Powershell,cmd,windows explorer =>它已被阻止.)
编辑: 使用ZetaLongPaths库中的ZlpIOHelper可以实现这一点,而标准的Directory类会抛出可怕的异常:
static void Main(string[] args)
{
var path = @"d:\temp\";
var dirName = "LooooooooooooooooooooooooooooooooooooooooooooongSubDirectory";
while (path.Length <= 280)
{
path = Path.Combine(path, dirName);
ZlpIOHelper.CreateDirectory(path); //Directory.CreateDirectory(path);
}
Console.WriteLine(path);
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)