Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:在当前用户Windows不拥有的目录中创建文件_C_Windows - Fatal编程技术网

C:在当前用户Windows不拥有的目录中创建文件

C:在当前用户Windows不拥有的目录中创建文件,c,windows,C,Windows,我最近创建了一个程序(最初用于linux),该程序需要能够创建文件以便保存数据。如果需要,它会创建一个包含文件的目录。这在linux和mac上运行良好,但在某些windows设置上却不行。我在一台全新的64位Windows 10虚拟机上进行了测试,一切正常(即,fopen,fwrite,fread工作正常),但在一台拥有Windows几年的计算机上进行测试时,它不会创建任何文件。但创建目录时没有问题 我相信这个问题和这里解释的问题是一样的 也就是说,NTFS文件系统(以及其中的所有目录)不属于试

我最近创建了一个程序(最初用于linux),该程序需要能够创建文件以便保存数据。如果需要,它会创建一个包含文件的目录。这在linux和mac上运行良好,但在某些windows设置上却不行。我在一台全新的64位Windows 10虚拟机上进行了测试,一切正常(即,
fopen
fwrite
fread
工作正常),但在一台拥有Windows几年的计算机上进行测试时,它不会创建任何文件。但创建目录时没有问题

我相信这个问题和这里解释的问题是一样的

也就是说,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
块在虚拟机上工作。

从CreateFile得到的错误是什么?如果显示
icacls目录\u路径
的输出,可能有助于澄清问题。我可以告诉你,它肯定与目录上的只读属性无关,而这个属性可能还没有设置。与Linux的“不可变”文件属性不同,在Windows中将目录设置为“只读”只能防止删除该目录;这与您是否可以添加或删除文件无关。我必须找到另一台有此问题的计算机,因为我无法访问第一台计算机。好的,至于CreateFile的错误,我添加了
perror(“CreateFile”)关闭手柄后的code>(测试)行,这会导致程序崩溃,并显示来自windows的消息“…遇到问题,需要关闭”。我现在测试的计算机正在运行windows XP,它说“'icacls'不能识别为内部或外部命令…”此外,在这台计算机上,它使用以下代码创建文件:HANDLE f=CreateFile(文件路径、通用写入、通用读取、文件共享读取、NULL、始终打开、文件属性正常、NULL);WriteFile(f,”、sizeof(“”)、NULL、NULL;CloseHandle(f);