我在网上搜索但没有找到令人信服的答案.文件系统VFAT和FAT32是否相同,或它们之间是否存在差异?
我知道FAT32,以及FAT16/12既不支持符号链接也不支持硬链接.不过我提出了这个想法:
FAT规范描述了每个文件都与目录条目相关联.根据我的理解,可以说目录中的文件条目以某种方式或其他方式指向文件的内容.
那么,我如何定义两个指向相同文件内容的目录条目?或者,什么可以阻止我这样做?
使用案例:我的汽车收音机有一个USB大容量存储设备,我想使用目录作为播放列表,因为收音机软件不支持播放列表.因此,对我来说,执行此操作时Windows的行为并不重要.
我有一个简短的C程序写入文件,直到磁盘上没有更多的空间:
#include <stdio.h>
int main(void) {
char c[] = "abcdefghij";
size_t rez;
FILE *f = fopen("filldisk.dat", "wb");
while (1) {
rez = fwrite(c, 1, sizeof(c), f);
if (!rez) break;
}
fclose(f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行程序(在Linux中)时,它会在文件达到2GB时停止.
由于FILE结构,是否存在内部限制?
谢谢.
我不是在寻找一种解决方法; 我想要一个解释.我通过Google找到的大多数链接都告诉我文件限制为4GB,但不是原因.
我知道维基百科的解释:http://en.wikipedia.org/wiki/File_Allocation_Table#FAT32
但这仍然没有详细说明原因.(SCANDISK与它有什么关系?)
也许那时我会理解是否有可能克服4GB的文件大小限制.
据我所知 - NTFS支持Unicode文件名(作为Micorsoft声称的UTF-16?).
但官方MSDN文档对于在FAT-32上用于存储文件名(文件路径)的代码页非常模糊.
在这里它说OEM代码页(我假设CP437)用于存储文件名:http://msdn.microsoft.com/en-us/library/windows/desktop/dd317748.aspx
但事实证明,可以有不同的OEM代码页,CP437就是其中之一:http://msdn.microsoft.com/en-us/library/windows/desktop/dd317752.aspx
而且我们现在所有像mount这样的实用程序都支持更多不同的FAT代码页,而不仅仅是OEM代码页集.
那么FAT-32文件名的实际cdepage是什么?这取决于FAT卷创建时的系统代码页?FAT可以支持真正的双字节字符集代码页,如UTF-16吗?或UTF-8等多字节字符集代码页是限制?
更具体的问题: 当我使用CreateFileW函数(如MSDN所述,使用UTF-16作为文件名代码页)在FAT-32卷上创建文件时会发生什么?
我有一个为Android设备编写的项目.它每天都会生成大量文件.这些都是文本文件和图像.该应用程序使用数据库来引用这些文件.
该应用程序应该在一点点使用后(可能在几天之后)清理这些文件,但这个过程可能会也可能不会起作用.这不是这个问题的主题.
由于历史性事故,文件的组织有点幼稚:一切都在同一个目录中; .hidden包含零字节.nomedia文件的目录,以防止MediaScanner对其进行索引.
今天,我看到报告错误:
java.io.IOException: Cannot create: /sdcard/.hidden/file-4200.html
at java.io.File.createNewFile(File.java:1263)
Run Code Online (Sandbox Code Playgroud)
关于SD卡,我看到它有足够的存储空间,但数量
$ cd /Volumes/NO_NAME/.hidden
$ ls | wc -w
9058
Run Code Online (Sandbox Code Playgroud)
删除大量文件似乎允许今天的文件创建继续进行.
遗憾的是,我没有尝试touch使用新文件来尝试在命令行上重现错误; 我还删除了几百个文件,而不是少数几个.
但是,我的问题是:
Nota Bene:SD卡是原样的 - 即我没有格式化它,所以我猜它会是FAT-*格式.
FAT-32格式的文件大小限制为2GB(远高于我正在处理的文件大小)和根目录中文件数量的限制.我绝对不会在根目录中编写文件.
我在一个Mercurial存储库上工作,该存储库被检出到Unix文件系统上,例如某些机器上的ext3,以及其他机器上的FAT32.
在Subversion中,我可以设置svn:executable属性来控制在支持这样一个位的平台上签出时是否应该将文件标记为可执行文件.无论我运行SVN的平台还是包含我的工作副本的文件系统,我都可以这样做.
在Mercurial中,如果克隆在Unix文件系统上,我可以chmod + x来获得相同的效果.但是如何在FAT文件系统上的文件上设置(或删除)可执行位?
我想创建一个新的VFAT图像并添加一些文件.
# Create file of 1MB size:
dd if=/dev/zero of=my-image.fat count=1 bs=1M
# Format file as VFAT:
mkfs.vfat ./my-image.fat
Run Code Online (Sandbox Code Playgroud)
现在我想将文件./abc,./ def和./ghi添加到图像中.
没有 mount -o loop或我怎么办fusermount?我只想写一个新的,空的,原始的VFAT图像.我不需要删除附加或任何"复杂"操作.
我试过,7z -a因为7zip可以读取VFAT图像,但它不知道如何写入它.
我需要用FAT32文件系统创建一个小分区图像(几MB).我在互联网上提出了一些关于FAT32分区的最小大小限制的矛盾信息.
当我mkfs在Linux中尝试将5MB分区作为FAT32时,我收到警告,因为它太小了.虽然,它写了一些东西.(我不确定它是否有效)当我尝试diskpart在Windows 中将5MB分区格式化为FAT32时,它就会失败.
FAT32分区有多小?
谢谢
我google了很多,我找不到这个问题的任何答案......
我有一个C++控制台应用程序,它读取1GB SD卡,修复不正确关闭的文件并相应地写入FAT表.SD卡最初由定制设备中的固件写入.它工作正常到Xp并停止在Win Vista/7中工作.我尝试提升权限:在管理员帐户类型中,我使用"以管理员身份运行"方法启动了一个cmd窗口,但没有运气.我还尝试使用清单,要求获得最高可用权限,但没有运气.
我在一些帖子中读到"Windows Vista根本不允许您从用户模式进程访问磁盘.有没有人知道绕过这种行为的方法?
我正在解决方法,但我想知道这是不可能的
编辑:
这是我在这里发表的第一篇文章,所以我对链接问题并不十分了解......但我根本没有任何垃圾邮件......只是在社区网站上询问:)
代码看起来像
hDevice = CreateFile(buffer,GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING,0,NULL);
Run Code Online (Sandbox Code Playgroud)
然后,我从SD读取BTB信息,查找并不正确地关闭文件.
最后在尝试写入SD时
WriteFile(hDevice,buffer,SD_SECTOR_SIZE, &temp, 0)
Run Code Online (Sandbox Code Playgroud)
我拒绝访问(错误#5)
CreateFile()上的字符串是\.\ g:因为g字母对应于我机器上的SD卡.一切正常,正如我之前所说的那样.我也尝试使用:带有FSCTL_LOCK_VOLUME的DeviceIoControl但是会出现mem故障错误.
希望这有助于理解和感谢任何帮助