2011-01-18 12 views
5

Cada vez que intento crear un archivo usando fopen, fopen actúa como si el archivo se hubiera abierto correctamente y tuviera acceso completo a él, pero no funciona t en realidad crea el archivo. Mi programa no tiene acceso de escritura a la carpeta raíz del sistema porque necesita acceso de administrador para escribir allí, pero ¿por qué no fopen() da ningún error?fopen falla de forma invisible al crear archivos en la unidad del sistema (C: )

¿Alguna idea de cómo decir si hay un error o no? El identificador de archivo que se devuelve cuando intento abrir el archivo en un directorio protegido es exactamente el mismo que cuando abro un archivo en un directorio donde tengo acceso de escritura.

He intentado esto con las diferentes versiones de fopen (fopen, _wfopen, _wfopen_s) pero todas tienen el mismo resultado.

Curiosamente, GetLastError() devuelve ERROR_ALREADY_EXISTS.

Aquí está el código que estoy usando:

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: Como rerun señaló, el archivo está siendo creado en% APPDATA% debido virtualization. ¿Alguien sabe cómo desactivar esta característica?

Respuesta

6

Esto podría tener que ver con la tienda virtual. Eche un vistazo a here para obtener información.

+0

Ciertamente sí. –

+0

Guau, sí, ahí es donde terminaba el registro, ¡gracias! ¿Alguna idea de cómo hacer fopen arrojar un error en su lugar? –

3

Si está ejecutando literalmente el código que publicó, entonces no está pidiendo un archivo en el directorio raíz en absoluto. Necesitará ir a "c:\\filename.txt" (dos '\' caracteres) en su lugar. Tal vez si miras en el directorio actual, encontrarás que has creado con éxito un archivo con un nombre raro (básicamente <formfeed>ilename.txt, creo).

+0

No, eso fue un error en mi pregunta. Acabo de actualizarlo con mi código real. Gracias –

2

Tuvimos un problema similar en la virtualización del registro, sí, también está virtualizado después de Vista.

Nuestra solución fue Propiedades-> Enlazador-> Archivo de manifiesto-> Nivel de ejecución UAC-> requireAdministrator. En mi humilde opinión, también puede funcionar para su caso.

Cuestiones relacionadas