2011-01-14 12 views
8

Ho un programma a thread singolo che elabora cartelle e file in una directory di origine. C'è un modo per bloccare una cartella, con i file al suo interno, all'interno della mia directory sorgente da essere modificata da altri processi mentre il mio programma sta lavorando su di essa? Sto pensando a qualcosa sulla falsariga di mettere una sorta di blocco esclusivo sulla cartella stessa, quindi solo il processo del mio programma può usarlo.C# - Blocco della modifica di una cartella durante l'elaborazione

NOTA:

Non voglio bloccare la directory di origine radice stessa, solo ciò che la cartella (s), nel livello più alto di quella directory, mi potrebbe essere in fase di elaborazione in ogni particolare momento. Voglio ancora essere in grado di consentire ai processi esterni di aggiungere cartelle alla directory di origine, mentre sto elaborando altre cartelle.

UPDATE:

@Yuri - Sì, questo è un programma per Windows, un'applicazione di servizio Windows per essere esatti.

Parte di ciò che rende questo sia impegnativo e necessario è che ho bisogno di ricreare la struttura di qualsiasi cartella che sto elaborando, nella directory di origine, in una directory di destinazione separata. Quindi non posso avere nessun altro processo che modifichi le cartelle e i file mentre il mio programma sta lavorando con loro.

+0

Presumo Windows? –

+0

Mi chiedo se i nuovi metodi di transazione I/O potrebbero aiutare. – user7116

+0

Invece di bloccare la cartella, il tuo programma potrebbe semplicemente scansionare il contenuto una seconda volta per essere sicuro che non ci siano state modifiche esterne da quando hai iniziato (verifica nomi e date dei file) – Justin

risposta

7

modi per bloccare una cartella:

1.Mark è in sola lettura. (Incluso perché le persone lo provano sempre)
Con - Questo in realtà non funziona. Sulle cartelle, il flag di sola lettura viene utilizzato per altri scopi.

2. Mostra tutto il contenuto in sola lettura.
Con - Non impedirà determinati tipi di azioni (ad esempio, la creazione di nuovi elementi).

3. Utilizzare ACL
Con: non impedirà agli amministratori di fare scherzi con la cartella. Richiede determinati tipi di permessi.

4. Utilizzare ACL con un utente appositamente creato e abilitare Crittografia cartella.
Con - Questo è davvero orribile. Se qualcosa va storto, i tuoi dati potrebbero andare persi.

5. Nome/Spostare la cartella
Con - Può essere aggirato dalla stupidità dell'utente. risposta

6. (Edit) di gjvdkamp: Lock Individual files
Con - Come con 2 #, questo permette ancora creazione di nuovi file all'interno le cartelle. Detto questo, questo è The Right Way ™ per farlo.

+0

Ciao Brian, gli ACL potrebbero funzionare. Lasciando solo gli amministratori capaci di fare scherzi con una cartella e il suo contenuto potrebbe non essere un grosso problema nel mio caso fintanto che so che nessuno o niente altro può rovinare tutto. – kingrichard2005

+0

@kingrichard: abbastanza giusto. Personalmente, eseguo il mio IDE Dev come amministratore perché alcuni dei miei progetti funzionano come admin, quindi non funzionerebbe affatto per me. – Brian

+0

Punto 6: Bene, grazie signore! – gjvdkamp

0

Credo che questo potrebbe aiutare http://www.codeproject.com/KB/files/Unique_Folder_Protection.aspx

Ciò che l'articolo fondamentalmente fa è cambiare l'estensione della cartella in uno dei seguenti modi

"{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}" "{21EC2020-3AEA-1069-A2DD-08002B30309D}" "{2559a1f4-21d7-11d4-bdaf-00c04f60b9f0}" "{645FF040-5081-101B-9F08-00AA002F954E}" ". {2559a1f1 -21d7-11d4-bdaf-00c04f60b9f0} " ". {7007ACC7-3202-11D1-AAD2-00805FC1270E} "

e memorizza la password all'interno della cartella

Spero che questo aiuti

Alex

+0

Questo impedisce solo l'accesso tramite la shell di Explorer. È ancora possibile accedere alla cartella tramite la riga di comando e presumibilmente altri metodi che coinvolgono il percorso diretto (ad esempio altri programmi). Ovviamente, rinomina anche la cartella, il che potrebbe portare a un errore di lettura se qualcosa si aspetta che la cartella sia lì, ma non impedisce a nessuno di scrivere effettivamente lì. – Bob

6

modificare non noi questo hack, non funziona: http://itknowledgeexchange.techtarget.com/itanswers/folder-lock/

altrimenti sarei ciclo su tutti i file in foder, creare un list<FileStream> e quindi chiamare Blocca su ciascuno. Questo ti darebbe un controllo più dettagliato sui file da bloccare.

GJ

Edit: Prova qualcosa in queste righe:

var locks = new List<FileStream>(); 
var di = new DirectoryInfo(@"C:\Test"); 
foreach (var file in di.GetFiles()) { 
    var fs = new FileStream(file.FullName, FileMode.Open); 
    fs.Lock(0, 0); 
    locks.Add(fs); 
} 
+0

Penso che l'hack impedisca a Explorer di accedere alla cartella. Ma bloccare ogni singolo file sarebbe la mia raccomandazione. –

+0

Non ho provato questo trucco, ma mi piace la tua seconda idea, dal momento che sto già raccogliendo file dalla cartella (s) che sto elaborando. In tal caso, come aggiungerei un blocco a ciascun file nell'elenco? – kingrichard2005

+1

+1: Questo è molto più pulito dell'uso di readonly come pensavo, e i lock sono naturalmente rilasciati anche se il programma si blocca, a differenza della mia soluzione. – Brian

0

Perché non si prende una nuova copia della cartella, si lavora su quella quindi si sostituisce la vecchia se necessario?

+0

Perché se un altro servizio ha funzionato su quella cartella, tali azioni sarebbero gettate via. –

+0

È vero, è un compromesso. Ma quali altre opzioni ci sono: hacks loschi e impostazione readonly. – Nobody

+0

Un compromesso simile che evita questo problema è rinominare la cartella, anche se questo significa anche che i programmi che vogliono * leggere * la cartella non possono farlo neanche. – Brian

Problemi correlati