我正在设计一个数据库表,它将保存上传文件的文件名.Windows XP或Vista使用的NTFS文件名的最大长度是多少?
带NTFS的Windows如何使用大量文件和目录?
在遇到性能问题或其他问题之前,是否有关于可以放在单个目录中的文件或目录限制的指导?
例如,在其中有一个包含100,000个文件夹的文件夹,这是一件好事吗?
最近的NTFS和Windows实现了符号链接:
linkd或junction工具.mklink工具以来,NTFS符号链接也可用作符号链接(用于文件和目录).但是在Cygwin 1.7(安装在Windows 7上)上,ln -s创建了一个文本文件.
在Cygwin上:
$ ln -s -v target mylink
`mylink' -> `target'
Run Code Online (Sandbox Code Playgroud)
在MinGW(或你最喜欢的编辑):
$ cat mylink
!<symlink>ÿþt a r g e t
Run Code Online (Sandbox Code Playgroud)
是否有可能告诉Cygwing使用NTFS交接点或NTFS符号链接?
其他问题:MinGW上有这个吗?
我如何从.NET创建/删除/读/写/ NTFS备用数据流?
如果没有本机.NET支持,我会使用哪个Win32 API?另外,我如何使用它们,因为我不认为这是记录在案的?
我刚刚开始编写一些程序来处理WinXP系统上具有非英文名称的文件名.我已经完成了一些关于unicode的推荐阅读,我认为我得到了基本的想法,但有些部分对我来说仍然不是很清楚.
具体来说,什么编码(UTF-8,UTF-16LE/BE)是存储在NTFS 中的文件名(不是内容,而是文件的实际名称)?是否可以使用fopen()打开任何文件,它接受一个char*,或者我别无选择,只能使用wfopen(),它使用wchar_t*,并且可能需要一个UTF-16字符串?
我尝试手动输入UTF-8编码的字符串给fopen(),例如.
unsigned char filename[] = {0xEA, 0xB0, 0x80, 0x2E, 0x74, 0x78, 0x74, 0x0}; // ?.txt
FILE* f = fopen((char*)filename, "wb+");
Run Code Online (Sandbox Code Playgroud)
但这就是'ê°€.txt'.
我觉得UTF8编码的字符串足以打开Windows下的任何文件名,因为我似乎依稀记得一些Windows应用程序传递(char*),而不是(wchar_t*),并且没问题.
任何人都可以对此有所了解吗?
我在安装npm模块时遇到问题.NodeJS安装在Windows主机上的Virtual Box上运行的Ubuntu 11.10上.我的项目文件在NTFS分区上(我必须与windows共享它们).当我尝试安装一些npm模块时,我收到一个错误,并且没有安装模块.我发现当npm尝试创建符号链接时会出现问题.
可能你不能在NTFS分区上创建符号链接,当我在Linux文件系统中安装模块时,一切正常.
我怎样才能解决这个问题?我不想手动解决依赖关系:/
解决:
*可行的解决方案:@sbi
*解释实际发生的事情:@Hans
*解释为什么OpenFile没有通过"DELETE PENDING":@Benjamin
问题:
我们的软件在很大程度上是专有脚本语言的解释器引擎.该脚本语言能够创建文件,处理文件,然后删除文件.这些都是单独的操作,并且在这些操作之间没有保持打开文件句柄.(即在文件创建过程中创建一个句柄,用于写入,然后关闭.在文件处理部分,一个单独的文件句柄打开文件,从中读取,并在EOF关闭.最后,删除使用:: DeleteFile它只使用文件名,而不是文件句柄.
最近我们开始意识到特定的宏(脚本)有时无法在随后的某个随机时间创建文件(即它在"创建,处理,删除"的前100次迭代中成功,但是当它到来时回到创建它一百零一次,Windows回复"拒绝访问").
深入研究这个问题,我编写了一个非常简单的程序,它循环遍历这样的事情:
while (true) {
HANDLE hFile = CreateFileA(pszFilename, FILE_ALL_ACCESS, FILE_SHARE_READ,
NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
return OpenFailed;
const DWORD dwWrite = strlen(pszFilename);
DWORD dwWritten;
if (!WriteFile(hFile, pszFilename, dwWrite, &dwWritten, NULL) || dwWritten != dwWrite)
return WriteFailed;
if (!CloseHandle(hFile))
return CloseFailed;
if (!DeleteFileA(pszFilename))
return DeleteFailed;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这直接针对Win32 API,非常简单.我创建一个文件,写入它,关闭句柄,删除它,冲洗,重复...
但是在某些地方,我会在CreateFile()调用期间收到Access Denied(5)错误.看看sysinternal的ProcessMonitor,我可以看到底层的问题是当我试图再次创建它时,文件上有一个挂起的删除.
问题:
*有没有办法等待删除完成?
*有没有办法检测文件是否正在等待删除?
我们通过HFILE上的WaitForSingleObject()尝试了第一个选项.但是,在WaitForSingleObject执行之前,HFILE始终处于关闭状态,因此WaitForSingleObject始终返回WAIT_FAILED.显然,试图等待关闭的句柄不起作用.
我可以等待文件存在的文件夹的更改通知.但是,这似乎是一个非常开销密集的kludge只是偶尔会出现问题(也就是说:在我的Win7 x64 E6600 PC的测试中,它通常会失败迭代12000+ - 在其他机器上,它可以在迭代7或15或56或永远不会发生.
我无法识别任何明确允许此以太的CreateFile()参数.无论CreateFile有什么参数,当文件待删除时打开文件进行任何访问都是不行的.由于我可以在XP盒子和x64 Win7盒子上看到这种行为,我很确定这是微软的"按照预期"的核心NTFS行为.所以我需要一个允许操作系统在我尝试继续之前完成删除的解决方案,最好是不必要地占用CPU周期,并且没有观察该文件所在文件夹的极端开销(如果可能的话).
感谢您抽出宝贵时间阅读并发布回复.澄清问题欢迎!
[1]是的,这个循环返回写入失败或无法关闭哪个泄漏,但由于这是一个简单的控制台测试应用程序,应用程序本身退出,Windows保证所有句柄在操作系统关闭时完成.所以这里没有泄漏.
bool DeleteFileNowA(const char …Run Code Online (Sandbox Code Playgroud) 从Windows Vista开始,有一个新的Win32-API调用CreateSymbolicLink在NTFS文件系统上创建一个符号链接.
有谁知道是否有办法列出文件系统上所有现有的符号链接?