2011-01-18 6 views
5

Ilekroć próbuję utworzyć plik za pomocą fopen, fopen działa tak, jakby plik został poprawnie otwarty i ma pełny dostęp do niego, ale nie robi tego ". t faktycznie tworzy plik. Mój program nie ma uprawnień do zapisu w folderze głównym systemu, ponieważ potrzebuje uprawnień administratora, aby tam pisać, ale dlaczego fopen() nie daje żadnych błędów?fopen nie działa niewidocznie podczas tworzenia plików w napędzie systemowym (C: )

Każdy pomysł, jak stwierdzić, czy wystąpił błąd, czy nie? Uchwyt pliku, który zostanie zwrócony, gdy próbuję otworzyć plik w chronionym katalogu, jest dokładnie taki sam, jak po otwarciu pliku w katalogu, w którym mam dostęp do zapisu.

Próbowałem tego z różnymi wersjami fopen (fopen, _wfopen, _wfopen_s), ale wszystkie mają takie same wyniki.

Co ciekawe, GetLastError() zwraca ERROR_ALREADY_EXISTS.

Oto kod, który używam:

FILE *FileHandle; 
DWORD error = _wfopen_s(&FileHandle, L"\\filename.txt", L"a"); 
Win32Error = GetLastError(); 

if (error != 0 || FileHandle == NULL) 
{ 
    //Throw error 
} 
else 
{ 
    //write to file 
    //close file 
} 

EDIT: Jak rerun wskazał, plik jest uzyskiwanie wygenerowana w% appdata% z powodu virtualization. Czy ktoś wie, jak wyłączyć tę funkcję?

Odpowiedz

6

Może to mieć związek ze sklepem wirtualnym. Zajrzyj here, aby uzyskać informacje.

+0

Z pewnością tak. –

+0

Wow, tak, tam właśnie kończy się dziennik, dziękuję! Każdy pomysł, w jaki sposób można zrobić fopen zamiast tego podać błąd? –

3

Jeśli dosłownie uruchamiasz opublikowany kod, to w ogóle nie pytasz o plik w katalogu głównym. Musisz zamiast tego wpisać "c:\\filename.txt" (dwa znaki "\"). Być może, jeśli spojrzysz w bieżącym katalogu, zobaczysz, że udało Ci się stworzyć dziwnie nazwany plik (w zasadzie myślę, że jest to <formfeed>ilename.txt).

+0

Nie, to był literówka w moim pytaniu. Właśnie zaktualizowałem go moim faktycznym kodem. Dzięki –

2

Mieliśmy podobny problem z wirtualizacją rejestru, tak, jest również wirtualizowany po Vista.

Nasze rozwiązanie to Właściwości-> Łącznik-> Plik manifestu-> Poziom wykonania UAC-> requireAdministrator. IMHO, to może zadziałać również w twojej sprawie.

Powiązane problemy