我最近创建了一个程序(最初用于linux),它需要能够创建文件以便保存数据。如果需要,它会创建一个包含文件的目录。这在linux和mac上工作正常,但是在某些 Windows设置上,它没有。我在一个全新的64位Windows 10虚拟机上进行了测试,一切正常(即fopen
,fwrite
,fread
工作正常),但在有窗口的计算机上测试时几年来,它没有创建任何文件。创建目录时没有问题。
我认为问题与此处解释的问题相同https://superuser.com/questions/846143/remove-read-only-attribute-from-folder-after-windows-reinstall
也就是说,NTFS文件系统(以及其中的所有目录)不是试图运行我的程序的用户所拥有的。这归因于Windows安装创建的文件系统与现在尝试运行我的程序的安装不同。该问题的另一个描述是右键单击目录,转到属性并尝试取消选中只读是可能的,但是在重新检查时,它已经使自己再次读取。值得注意的是,“只读”复选框未选中,而是填充方形,而不是。
我的程序还有一个使用BufferedWriter的java组件。这似乎不受此问题的影响,并且可以创建文件没有问题,所以必须有可能绕过这个问题,我只是不知道如何在C中这样做。这是我的问题,我如何创建受此问题影响的Windows安装上的文件(使用C)?
我尝试过的代码不适用于有问题的Windows安装程序:
HANDLE test = CreateFile(file_path, GENERIC_WRITE,
0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(test, "file created", sizeof("file created"), NULL, NULL);
CloseHandle(test);
并且没有使用Windows API:
/* Open file for appending */
FILE *f = fopen(file_path, "ab+");
if (f == NULL) {
perror("fopen");
return -1;
}
int len_s = strlen(s);
/* Write the length of s to the file */
if (1 != fwrite(&len_s, sizeof(char), 1, f)) return -2;
fclose(f);
这些都不会创建文件,更不用说在有问题的Windows安装上编写内容了。值得注意的是fopen
代码块适用于linux,mac和我测试过的Windows 10虚拟机,CreateFile
块可以在虚拟机上运行。