2011-01-14 12 views
8

Ich habe ein Singlethread-Programm, das Ordner und Dateien in einem Quellverzeichnis verarbeitet. Gibt es eine Möglichkeit, einen Ordner mit darin enthaltenen Dateien in meinem Quellverzeichnis daran zu hindern, von anderen Prozessen geändert zu werden, während mein Programm daran arbeitet? Ich denke an etwas, das eine Art exklusive Sperre für den Ordner selbst darstellt, so dass er nur vom Programm meines Programms verwendet werden kann. nur was Ordner (n), in der obersten Ebene des Verzeichnisses, ich könnte die Verarbeitung zu einem bestimmten ZeitpunktC# - Blockieren eines Ordners vor der Änderung während der Verarbeitung

Ich will nicht das Root-Quellverzeichnis selbst blockieren:

HINWEIS. Ich möchte immer noch zulassen, dass externe Prozesse Ordner zum Quellverzeichnis hinzufügen können, während ich andere Ordner verarbeite.

UPDATE:

@Yuri - Ja, das ist ein Windows-Programm, eine Anwendung Windows-Dienstes genau zu sein.

Ein Teil von dem, was dies sowohl schwierig als auch notwendig macht, ist, dass ich die Struktur der Ordner, die ich verarbeite, im Quellverzeichnis in einem separaten Zielverzeichnis neu erstellen muss. Ich kann also keinen anderen Prozess haben, der Ordner und Datei (en) verändert, während mein Programm damit arbeitet.

+0

Ich gehe von Windows aus? –

+0

Ich frage mich, ob die neuen I/O-Transaktionsmethoden helfen könnten. – user7116

+0

Anstatt den Ordner zu sperren, könnte Ihr Programm den Inhalt nur ein zweites Mal durchsehen, um sicherzustellen, dass es seit dem Start keine externen Änderungen gegeben hat (Überprüfung von Dateinamen und Daten). – Justin

Antwort

7

Möglichkeiten, einen Ordner zu sperren:

1.Mark es nur lesbar. (Inbegriffen, weil Leute das immer versuchen)
Con - Dies funktioniert nicht wirklich. In Ordnern wird das Readonly-Flag für andere Zwecke verwendet.

2.Markieren Sie den gesamten Inhalt nur lesbar.
Con - Verhindert bestimmte Arten von Aktionen nicht (z. B. neue Elemente erstellen).

3.Verwenden Sie ACL
Con - Verhindert nicht, dass Administratoren mit dem Ordner unordentlich machen. Erfordert bestimmte Arten von Berechtigungen.

4.Verwenden Sie die ACL mit einem speziell erstellten Benutzer und aktivieren Sie die Ordnerverschlüsselung.
Con - Das ist wirklich erschreckend. Wenn etwas schief geht, sind Ihre Daten möglicherweise verloren.

5.Rename/Verschieben Sie den Ordner
Con - Kann von Benutzer Dummheit umgangen werden.

6. (Edit) gjvdkamp Antwort: Lock Individual files
Con - Wie bei # 2, dies ermöglicht noch neue Dateien innerhalb der Ordner erstellen. Das heißt, das ist The Right Way ™ zu tun.

+0

Hallo Brian, ACLs können arbeiten. Nur die Admins zu belästigen, die in der Lage sind, mit einem Ordner und dessen Inhalten herumzuspielen, ist in meinem Fall kein großes Problem, solange ich weiß, dass niemand oder nichts anderes damit herumspielen kann. – kingrichard2005

+0

@kingrichard: Fair genug. Ich persönlich betreibe meine Entwicklungs-IDE als Administrator, weil einige meiner Projekte als Admin laufen, also würde das für mich überhaupt nicht funktionieren. – Brian

+0

Punkt 6: Nun, danke, Sir! – gjvdkamp

0

ich denke, dies könnte Ihnen helfen http://www.codeproject.com/KB/files/Unique_Folder_Protection.aspx

Was im Grunde der Artikel tut, ist die Erweiterung der auf eine der folgenden

Ordner ändern „{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} "

und speichert das Passwort in den Ordner

this helps

Alex

+0

Dies verhindert nur den Zugriff über die Explorer-Shell. Es ist immer noch möglich, auf den Ordner über die Befehlszeile zuzugreifen, und vermutlich auf andere Methoden, die den direkten Pfad betreffen (z. B. andere Programme). Natürlich wird der Ordner auch umbenannt, was zu einem Lesefehler führen kann, wenn etwas erwartet, dass der Ordner da ist, aber nichts davon abhält, dort tatsächlich zu schreiben. – Bob

6

bearbeiten Sie nicht, uns dieser Hack funktioniert nicht: http://itknowledgeexchange.techtarget.com/itanswers/folder-lock/

sonst würde ich Schleife über alle Dateien in foder, erstellen Sie eine list<FileStream> und rufen Sie dann Lock auf jedem. Dies würde Ihnen eine feinere Kontrolle darüber geben, welche Dateien gesperrt werden sollen.

GJ

Edit: etwas in dieser Richtung versuchen:

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

Ich glaube, der Hack stoppt nur den Zugriff des Explorers auf den Ordner. Aber das Sperren jeder einzelnen Datei wäre meine Empfehlung. –

+0

Ich habe diesen Hack nicht probiert, aber ich mag deine zweite Idee, da ich bereits Dateien aus den Ordnern sammle, die ich gerade verarbeite. Wie würde ich in diesem Fall eine Sperre zu jeder Datei in der Liste hinzufügen? – kingrichard2005

+1

+1: Das ist viel sauberer als die Verwendung von readonly, wie ich dachte, und die Sperren werden natürlich freigegeben, auch wenn das Programm abstürzt, anders als mit meiner Lösung. – Brian

0

Warum nehmen Sie keine neue Kopie des Ordners, arbeiten Sie daran, ersetzen Sie dann den alten, wenn nötig?

+0

Wenn ein anderer Dienst an diesem Ordner arbeitete, wurden diese Aktionen verworfen. –

+0

Wahr, es ist ein Kompromiss. Aber welche anderen Möglichkeiten gibt es: zweifelhafte Hacks und das Setzen von Readonly. – Nobody

+0

Ein ähnlicher Kompromiss, der dieses Problem vermeidet, besteht darin, den Ordner umzubenennen, obwohl dies auch bedeutet, dass Programme, die nur den Ordner * lesen * wollen, dies auch nicht tun können. – Brian

Verwandte Themen