c - C:在当前用户不拥有的目录中创建文件,Windows
问题描述
我最近创建了一个程序(最初用于 linux),它需要能够创建文件以便保存数据。如果需要,它会创建一个包含文件的目录。这在 linux 和 mac 上运行良好,但是在某些windows 设置上,它没有。我在新的 64 位 Windows 10 虚拟机上进行了测试,一切正常(即 , fopen
,fwrite
工作fread
正常),但是在安装了几年 Windows 的计算机上进行测试时,它没有创建任何文件。该目录的创建没有问题。
我相信问题与此处解释的问题相同https://superuser.com/questions/846143/remove-read-only-attribute-from-folder-after-windows-reinstall
也就是说,尝试运行我的程序的用户不拥有 NTFS 文件系统(以及其中的所有目录)。这归因于创建文件系统的 Windows 安装与现在尝试运行我的程序的安装不同。该问题的另一种描述是右键单击目录,转到“属性”并尝试取消选中“只读”是可能的,但在重新检查后,它又将自身设为“只读”。值得注意的是,只读复选框没有被选中,而是用一个正方形填充。
我的程序还有一个使用 BufferedWriter 的 java 组件。这似乎不受这个问题的影响,可以创建文件没有问题,所以必须有可能绕过这个问题,我只是不知道如何在 C 中做到这一点。这就是我的问题,我如何创建文件(使用C) 在受此问题影响的 Windows 安装上?
我尝试过的代码在错误的 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
块适用于虚拟机。
解决方案
推荐阅读
- ios - 如何在swift5中调整UINavigationBar的位置?
- java - 通过 Logback 记录到 App Engine request_log
- oracle - R2DBC - Oracle 数据库支持
- java - 流如何在内部处理数据?
- angular - 从Angular8中的链接中删除Html编码字符
- cmake - CMake set_property() 似乎不适用于源文件
- javascript - PinchZoom.js 与 iOS 设备上的 Owl Carousel 不兼容
- c# - jqGrid 树网格版本 4.5.2 无法让树工作
- angular - MAT_DATEPICKER_VALIDATORS 的错误代码是什么?
- sql-server - Docker 上 SQLserver 中 FILESTREAM 功能的替代方案