Avatar billede Slettet bruger
13. juni 2003 - 09:54 Der er 11 kommentarer

Låsning af fil

Hvordan laver jeg en simpel låsning af en fil i C? Således den kun kan åbnes af een af gangen?
Hverken open eller fopen låser åbenbart filen, heller ikke når den åbnes i write mode.
Avatar billede Slettet bruger
13. juni 2003 - 10:01 #1
Avatar billede Slettet bruger
13. juni 2003 - 10:02 #2
#include <iostream.h>
#include <stdio.h>
#include <string>
using std::string;

int main()
{
    char row[1024];
    FILE* fp;
    fp = fopen("test.txt","r");
    while(fgets(row, 1024, fp))
    {
        cout << row << endl;
    }
    fclose(fp);
    return 0;
}
Avatar billede Slettet bruger
13. juni 2003 - 10:12 #3
FILE* out1;
FILE* out2;

int simple1, simple2;

out1 = fopen("testlock", "r+");
if (!out1) printf("FEJL!/n");
else printf("OK");

out2 = fopen("testlock", "r+");
if (!out2) printf("FEJL!/n");
else printf("OK");

if ( (simple1 = open("testlock", O_RDWR)) < 0) printf("FEJL");
else printf("OK");

if ( (simple1 = open("testlock", O_RDWR)) < 0) printf("FEJL");
else printf("OK");

fopen låser ikke filen!
Avatar billede Slettet bruger
13. juni 2003 - 11:33 #4
Sorry... Læste lige lidt for hutigt
Avatar billede arne_v Ekspert
13. juni 2003 - 11:48 #5
Hvilken platform ?  Windows ? Linux ? Strict standard due to portability
requirement ?
Avatar billede soreno Praktikant
13. juni 2003 - 15:58 #6
Med win32 kan du bruge LockFile:

The LockFile function locks a region in an open file. Locking a region prevents other processes from accessing the region.

BOOL LockFile(
    HANDLE hFile,    // handle of file to lock
    DWORD dwFileOffsetLow,    // low-order word of lock region offset
    DWORD dwFileOffsetHigh,    // high-order word of lock region offset 
    DWORD nNumberOfBytesToLockLow,    // low-order word of length to lock
    DWORD nNumberOfBytesToLockHigh     // high-order word of length to lock
  );




Hvis du skulle få lyst til at låse filen op igen kan du bruge UnlockFile:

The UnlockFile function unlocks a region in an open file. Unlocking a region enables other processes to access the region.

BOOL UnlockFile(
    HANDLE hFile,    // handle of file to unlock
    DWORD dwFileOffsetLow,    // low-order word of lock region offset
    DWORD dwFileOffsetHigh,    // high-order word of lock region offset 
    DWORD nNumberOfBytesToUnlockLow,    // low-order word of length to unlock
    DWORD nNumberOfBytesToUnlockHigh     // high-order word of length to unlock
  );
Avatar billede arne_v Ekspert
13. juni 2003 - 16:14 #7
Hvis det er Win32, så vil jeg tro at til dette specifikke
spørgsmål at CreateFile med dwShareMode=0 var simplere end
LockFile & UnlockFile.
Avatar billede soreno Praktikant
13. juni 2003 - 16:17 #8
Det kunne der jo være noget om..

:-)
Avatar billede Slettet bruger
14. juni 2003 - 10:58 #9
> Hvilken platform ?  Windows ? Linux ? Strict standard due to portability
requirement ?

Jeg havde troet der var en cross-platform standard - men der er der åbenbart ikke. Lige nu udvikler jeg på Mac OSX, men når det er færdigt skal det nok op på en Linux.
Avatar billede jakobdo Ekspert
15. juni 2003 - 11:25 #10
Hvorfor skal du have låst din fil?
Skal du lave et flerbruger system?
Hvis ja, så kan du vel bruge noget mutex_lock...
Avatar billede Slettet bruger
15. juni 2003 - 13:34 #11
Ja det er til et CGI script. Jeg arbejder nu med an skyggefil - som jeg opretter og sletter igen, problemet er bare at der ikke kun en eller to men 10.000 vis af filer der kan låses. Det er en masse skyggefiler, der skal holdes rede i. Og hvis der er en skyggefil der ikke lige bliver slettet igen (hvis programmet går ned eller hvad ved jeg), er filen permanent låst.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester