这是处决的截图:
如您所见,错误显示“JSONFiles/Apartment/Rent/dubizleabudhabiproperty”目录不存在。
但请看我的档案:
文件夹肯定在那儿。
守则
self.file = open("JSONFiles/"+ item["category"]+"/" + item["action"]+"/"+ item['source']+"/"+fileName + '.json', 'wb') # Create a new JSON file with the name = fileName parameter
line = json.dumps(dict(item)) # Change the item to a JSON format in one line
self.file.write(line) # Write the item to the file
当我将文件名更改为较小的文件名时,它会起作用,所以问题在于路径的长度。请问解决办法是什么?
常规DOS路径限制为
MAX_PATH
(260)个字符,包括字符串的终止字符NUL
。通过使用以\\?\
前缀开头的扩展长度路径,可以超过此限制。此路径必须是完全限定的Unicode字符串,并且只能使用反斜杠作为路径分隔符。根据Microsoft的file system functionality comparison,最大扩展路径长度为32760个字符。单个文件或目录名最多可以包含255个字符(UDF文件系统为127个字符)。扩展的UNC路径也支持为\\?\UNC\server\share
。例如:
请参阅MSDN上的以下页面:
背景
Windows调用NT运行库函数
RtlDosPathNameToRelativeNtPathName_U_WithStatus
将DOS路径转换为本机NT路径。如果上面的路径在后面的函数上设置了断点,我们可以看到它如何处理以前缀\\?\
开头的路径。结果将} :
\\?\
替换为NT DOS设备前缀\??\
,并将字符串复制到本机^{如果使用
//?/
而不是\\?\
,则路径仍限制为MAX_PATH
个字符。如果太长,则RtlDosPathNameToRelativeNtPathName
返回状态代码STATUS_NAME_TOO_LONG
(0xc000106)。如果使用
\\?\
作为前缀,但在路径的其余部分使用斜杠,则Windows不会为您将斜杠转换为反斜杠:正斜杠是NT命名空间中的有效对象名字符。它由Microsoft文件系统保留,但您可以在其他命名的内核对象中使用正斜杠,这些对象存储在
\BaseNamedObjects
或\Sessions\[session number]\BaseNamedObjects
中。另外,我不认为I/O管理器对设备和文件名中的保留字符强制执行策略。这取决于设备。也许有人有一个Windows设备,它实现了一个名称空间,允许在名称中使用正斜杠。至少可以创建包含正斜杠的DOS设备名。例如:你可能想知道
\??
意味着什么。这曾经是对象名称空间中DOS设备链接的实际目录,但从NT 5(或NT 4 w/Terminal Services)开始,这就变成了一个虚拟前缀。对象管理器通过首先检查目录\Sessions\0\DosDevices\[LOGON_SESSION_ID]
中登录会话的DOS设备链接,然后检查目录\Global??
中的系统范围的DOS设备链接来处理此前缀。请注意,前者是登录会话,而不是Windows会话。登录会话目录都在Windows会话0的
DosDevices
目录下(即Vista+中的服务会话)。因此,如果您有用于非提升登录的映射驱动器,您将发现它在提升的命令提示符中不可用,因为提升的令牌实际上用于不同的登录会话。DOS设备链接的一个例子是
\Global??\C:
=>;\Device\HarddiskVolume2
。在这种情况下,DOSC:
驱动器实际上是指向HarddiskVolume2
设备的符号链接。以下是系统如何处理解析路径以打开文件的简要概述。假设我们调用WinAPI} 结构中,并调用系统函数
CreateFile
,它将转换后的NTUNICODE_STRING
存储在^{NtCreateFile
。NtCreateFile
调用I/O管理器函数^{ObOpenObjectByName
。这是解析路径的工作。对象管理器以\??\C:\Temp\test.txt
开头。然后它用\Global??\C:Temp\test.txt
替换它。接下来它解析到C:
符号链接,并且必须重新开始(重新解析)最终路径\Device\HarddiskVolume2\Temp\test.txt
。一旦对象管理器到达}创建} 发送到设备驱动程序。如果设备实现重分析点(例如连接装入点、符号链接等),并且路径包含重分析点,则必须将解析的路径重新提交给对象管理器,以便从一开始就进行分析。
HarddiskVolume2
设备对象,解析就传递给I/O管理器,它实现Device
对象类型。I/O的ParseProcedure
{File
对象和major function codeIRP_MJ_CREATE
(打开/创建操作)的I/O Request Packet (IRP)由设备堆栈处理。这将通过^{设备驱动程序将在遍历目录时使用进程标记(或者如果模拟则使用线程)的} 进行验证。除了像FAT32这样的简单文件系统不支持文件安全之外。
SeChangeNotifyPrivilege
(几乎总是存在并启用)来绕过访问检查。但是,最终对设备和目标文件的访问必须由安全描述符来允许,该描述符通过^{出现此错误可能有多种原因。请确保:
文件夹的父目录(JSONFiles)与Python脚本的目录相同。
尽管文件夹存在,但并不意味着单个文件存在。验证相同的文件名,并确保确切的文件名与您的Python代码试图访问的文件名匹配。
如果您仍然面临问题,请在您试图访问的最里面的文件夹上共享“dir”命令的结果。
相关问题 更多 >
编程相关推荐