2009-05-08 7 views
9

¿Cómo puedo denegar el acceso a un archivo que abro con fstream? ¿No puedo acceder al archivo mientras leo/escribo con Fstream?Uso de std: fstream cómo denegar el acceso (lectura y escritura) al archivo

+0

Necesito leer del archivo y cambiar las líneas de acuerdo con el contenido. Quiero evitar cambios en el archivo mientras estoy leyendo y escribiendo en él (tengo los datos más recientes y no los anulo) Lo implementé usando fstream, ¿tengo que cambiar todo el código para usar identificadores y almacenamientos intermedios (readfile) o puedo obtener un Handle from fstream? Tuve problemas con readfile y writefile porque necesito leer línea por línea y escribir así. (Con fstream utilicé la función getline fs fstream (PATH), mientras que (file.eof()) \t getline (fs, línea);.! hacer algo ... fs.write (str, str.size ()); fs.clear(); fs.close(); – sofr

+0

¿Desea proteger su archivo de otra instancia de su programa o de un programa diferente? Para el primero, una solución fácil es usar archivos de bloqueo/directorios - la mayoría de los programas lo hacen de esta manera. Por el segundo, nunca lo he visto suceder, si realmente lo necesita, vea mi respuesta. – Hali

Respuesta

13

No puede hacerlo con el flujo estándar, tendrá que usar funciones específicas de la plataforma.

En Windows, puede usar CreateFile() o LockFileEx(). En Linux, hay flock(), lockf() y fcntl() (como dijo el comentador anterior).

Si está utilizando MSVC, puede pasar un tercer parámetro al constructor de fstream. Consulte la documentación para Visual Studio 6 o newer versions. Por supuesto, no funcionará con otros compiladores y plataformas.

¿Por qué quieres bloquear a los demás de todos modos? Puede haber una solución mejor ...

+1

[Este hilo] (http: // stackoverflow.com/questions/4435091/sh-none-is-not-a-member-of-stdbasic-filebuf-elem-traits/4435481 # 4435481) proporciona más información sobre el uso de 'fstream' – Casebash

3

No hay forma de hacerlo en C++ nativo, ya que dependería en gran medida de la plataforma. En Linux/UNIX, puede hacer esto con flock o fcntl. No estoy seguro de cómo hacerlo en Windows.

En Windows, parece que tiene que pasar algunas banderas al CreatFile o usar LockFileEx (que permite el bloqueo del rango de bytes).

Tenga en cuenta que todos estos métodos funcionan en los descriptores/identificadores de archivos del sistema operativo subyacente, no en fstream s. Necesitará utilizar Posix o la API de Windows para leer/escribir desde el archivo, o ajustar el descriptor/manejador del archivo en un fstream. Esto depende de la plataforma de nuevo. Estoy seguro de que hay una manera de hacerlo, pero no lo recuerdo en la cabeza.

2

Al utilizar el módulo Boos Interprocess, existe la funcionalidad file lock.

Bloquea el archivo, ábrelo, lee y/o escribe desde/hacia él, ciérralo, desbloquéelo.

4

Ampliando el comentario de Casebash:

Para abrir un archivo en Windows para que otros procesos no pueden escribir en él uso

file.rdbuf()->open(path, std::ios_base::app, _SH_DENYWR); 

_SH_DENYRW negará tanto de lectura como de

Cuestiones relacionadas