Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C] - Attributi file windows

    Ciao, avrei bisogno di capire se e come e` possibile manipolare gli attributi di un file su windows, in modo da permetterne la cancellazione/lettura quando il sistema dice che e` "occupato" o "in uso" da altra applicazione o dal sistema stesso.

    Scusate se mi esprimo come un gladiatore sardo, ma vengo dal mondo linux e ho qualche difficolta` a capire la terminologia di windows.

    Thx.
    Are you alive?
    No, but I was written with LOVE. A new scripting language.
    www.frequenze.it

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254

    Re: [C] - Attributi file windows

    Originariamente inviato da Mutato
    Ciao, avrei bisogno di capire se e come e` possibile manipolare gli attributi di un file su windows, in modo da permetterne la cancellazione/lettura quando il sistema dice che e` "occupato" o "in uso" da altra applicazione o dal sistema stesso.
    Se vuoi avere informazioni su file/directory puoi usare la funzione _stat() che però non dà molte informazioni, in particolare sugli attributi.

    Ma puoi usare anche le API Win32, in particolare le funzioni: GetFileAttributes / SetFileAttributes. Inoltre dai una occhiata a tutte le altre API Win32 per il "File management", vedi <qui>.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Comunque il fatto che il sistema ti dica che è "in uso" o "occupato" non dipende dagli attributi, quanto dal fatto che delle applicazioni stanno usando il file (o, quantomeno, hanno un handle aperto ad esso).
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Originariamente inviato da MItaly
    Comunque il fatto che il sistema ti dica che è "in uso" o "occupato" non dipende dagli attributi, quanto dal fatto che delle applicazioni stanno usando il file (o, quantomeno, hanno un handle aperto ad esso).
    Non e` questo il punto. Immagino che Windows scriva da qualche parte che quel file e` "occupato", se non sono gli attributi allora deve usare un altro meccanismo. E a questo punto la mia domanda e`: quale? e` possibile interagire con esso?
    Are you alive?
    No, but I was written with LOVE. A new scripting language.
    www.frequenze.it

  5. #5
    E a questo punto la mia domanda e`: quale?
    Gli handles; se Windows vede che c'è un handle aperto al file ti dice che non si può cancellare. Per sbloccarlo devi forzare la chiusura degli handles al file in questione, ma questo può rappresentare un problema perché le applicazioni che lo stanno usando potrebbero risentirne.
    Si devono usare API come CloseFile e UnlockFile sugli handles al file aperti, anche se non ho idea di come recuperare gli handles aperti ad un file. Per visualizzare gli handle aperti ad un file puoi usare l'utility della SysInternals handles, e per sbloccare files bloccati puoi usare unlocker.
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da Mutato
    Non e` questo il punto. Immagino che Windows scriva da qualche parte che quel file e` "occupato", se non sono gli attributi allora deve usare un altro meccanismo. E a questo punto la mia domanda e`: quale? e` possibile interagire con esso?
    Gli attributi quali "readonly", "nascosto", "di sistema", ecc... sono memorizzati sul file system. Mentre invece un lock su un file è una condizione che nasce dall'uso che ne fanno le applicazioni in un determinato momento. Quindi è una situazione, per così dire, "dinamica".

    Ho scritto questo codice che usa funzioni Win32:
    codice:
    HANDLE hFile;
    
    hFile = CreateFile (szNomeFile, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    
    if (hFile != INVALID_HANDLE_VALUE)
    {
        CloseHandle (hFile);
        printf ("File is not locked\n");
    }
    else
    {
        DWORD dwError = GetLastError ();
    
        if (dwError == ERROR_SHARING_VIOLATION)
            printf ("File is locked\n");
        else
            printf ("ERROR: %lu\n", dwError);
    }
    Non ho la pretesa di dire che è perfetto (e non so neanche se è il modo migliore per fare il test sul lock) ma sembra funzionare.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    La condizione di locking di un file viene determinata dall'esame in memoria di apposite tabelle che elencano gli handle aperti per un file.

    Non e' possibile accedere a tali tabelle direttamente (eseguendo cosi' un qualsiasi "override" delle informazioni) ma si puo' forzare la chiusura degli handle con apposite API.

    Il problema e' che non dovrebbe essere effettuata una operazione del genere, perche' potrebbe creare malfunzionamenti alle applicazioni che utilizzano tali file, nonche' corruzione dei dati essi contenuti.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.