首页 > 解决方案 > 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块适用于虚拟机。

标签: cwindows

解决方案


推荐阅读