C: Oprettelse af en fil i en mappe, der ikke ejes af den nuværende bruger, Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har for nylig oprettet et program (oprindeligt til Linux), der kræver evnen til at oprette filer, så det kan gemme data. Det opretter en mappe, der indeholder filerne, hvis det er nødvendigt. Dette virker fint på linux og mac, men på nogle windows opsætninger, det gør det ikke. Jeg testede på en ny 64-bit Windows 10-virtuel maskine, og alt fungerer fint (dvs. fopen, fwrite, fread fungerer fint), men når det testes på en computer, der har haft vinduer i nogle år skaber det ingen filer. Mappen er dog oprettet uden problemer.


Jeg tror, ​​problemet er det samme som det her forklarede https://superuser.com/questions/846143/remove-read-only-attribute-from-folder-after-windows-reinstall[8]


Det vil sige, at NTFS-filsystemet (og derfor alle katalogerne i det) ikke ejes af brugeren, der forsøger at køre mit program. Dette skyldes, at Windows-installationen, der skabte filsystemet, ikke var den samme installation, som nu forsøger at køre mit program. En anden beskrivelse af problemet er, at højre klik på en mappe, der går til Egenskaber , og at forsøge at fjerne markeringen af ​​Kun læsning er mulig, men ved gencheckning har den gjort sig selv Read Only igen. Det er værd at bemærke, at afkrydsningsfeltet Læs ikke er tjekket, men fyldt med en firkant, snarere.


Mit program har også en java komponent til den, der gør brug af BufferedWriter. Dette ser ud til at være upåvirket af dette problem og kan ikke skabe filer uden problemer, så det skal være muligt at omgå dette problem, jeg ved bare ikke hvordan man gør det i C. Og det er mit spørgsmål, hvordan Jeg opretter filer (Brug C) på en Windows-installation, der er berørt af dette problem?


Kode, som jeg har prøvet, virkede ikke på installationerne i bugged 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);


og bruger ikke 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);


Ingen af ​​disse skaber filerne endsige skriv indholdet på bugged windows installeren. Det er værd at bemærke kodekoden fopen, hvad der virker på Linux, Mac og Windows 10-virtuelle maskine, jeg testede på, og CreateFile -blokken fungerer på den virtuelle maskine.

Bedste reference