Entwickler-Ecke
Dateizugriff - Verzeichnis ink Unterverzeichnisse Schreibschutz entfernen
megaperlz - Di 21.06.05 12:03
Titel: Verzeichnis ink Unterverzeichnisse Schreibschutz entfernen
das Topic sagt eigentlich schon alles aus...
ich hab ein verzeichnis mit ca 100 unterverzeichnissen und jeder menge dateien die ich von einer cd runterkopiere...
diese sind natürlich alle schreibgeschützt :-(
gibts ne möglichkeit direkt bei allen dateien den schreibschutz aufzuheben oder muss ich da ne schleife bauen die jede datei einzelnt abklappert? (und falls doch wie könnte ich dies realisieren?)
mfg
azubi_20 - Di 21.06.05 12:56
Hallo,
Delphi-Quelltext
1:
| SetFileAttributes (PChar ('C:\DeinOrdner'),FILE_ATTRIBUTE_NORMAL); |
setzt bei C:\DeinOrdner alle Attribute auf nicht aktiviert (keine Attribute)
Damit wird auch der Schreibschutz entfernt. :)
Das gilt aber wahrscheinlich nicht für die Unterordner :(
Dazu musst du in einer Schleife alle Unterordner und Dateien scannen (Rekursion) :lol: :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure GetFilesInDirectory(ADirectory: string; AMask: String; ARekursiv: Boolean); var SR: TSearchRec; begin if (ADirectory<>'') and (ADirectory[length(ADirectory)]<>'\') then ADirectory:=ADirectory+'\';
if (FindFirst(ADirectory+AMask,faAnyFile-faDirectory,SR)=0) then begin repeat if (SR.Name<>'.') and (SR.Name<>'..') and (SR.Attr<>faDirectory) then SetFileAttributes (PChar (ADirectory+SR.Name),FILE_ATTRIBUTE_NORMAL) until FindNext(SR)<>0; FindClose(SR); end;
if ARekursiv then if (FindFirst(ADirectory+'*.*',faDirectory,SR)=0) then begin repeat if (SR.Name<>'.') and (SR.Name<>'..') then GetFilesInDirectory(ADirectory+SR.Name,AMask,True); until FindNext(SR)<>0; FindClose(SR); end; end; |
Beispielaufruf :
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin GetFilesInDirectory('C:\DeinOrdner','*.*',true); end; |
(frei nach
http://www.delphi-forum.de/viewtopic.php?t=94&highlight=rekursiv+nach+dateien+++unterverzeichnissen+suchen)
Der erste Parameter erwartet den Ordner, den du scannen willst.
Der zweite Parameter erwartet eine Dateimaske.
Der dritte Parameter erwartet, ob in Unterverzeichnissen (=true) gesucht werden soll oder nicht (=false).
Die procedure wird allerdings nur die Dateien und nicht die Ordner berücksichtigen aber das schaffst du mit ein paar Veränderungen bestimmt selber...
Viel Spass
BenBE - Di 21.06.05 13:00
Klarer Fall für mein FileCopy ;-) Siehe Anhang ...
Günstige Blockgrößen liegen bei 128 und 256 für CDs, 64 für Disketten. Schnelle Netzwerke (100MBit++) sollten mit 512 gut laufen. Bei Festplatten solltest Du auch mit 1024 KB Puffer recht gute Ergebnisse bekommen. Entscheidend ist immer das langsamste Medium.
Eine neue Version wird irgendwann mal folgen, aber ATM hab ich keine Zeit an dem Programm weiterzuarbeiten (außer kleinere Bugfixes, falls nötig).
Known: Bei großen Datenmengen kann es zu GDI-Fehlern kommen, die ich jedoch nicht eingrenzen konnte (Leinwand erlaubt kein Zeichnen).
Warn: Die Move-Funktion nicht für sensible Daten nutzen! Ist nicht bis ins letzte getestet. Ich übernehm keine Garantie, dass sie immer 100%ig funktioniert!
Sprint - Di 21.06.05 13:10
Titel: Re: Verzeichnis ink Unterverzeichnisse Schreibschutz entfern
megaperlz hat folgendes geschrieben: |
gibts ne möglichkeit direkt bei allen dateien den schreibschutz aufzuheben oder muss ich da ne schleife bauen die jede datei einzelnt abklappert? (und falls doch wie könnte ich dies realisieren?) |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
| procedure RemoveReadOnlyAttr(const Path: String);
procedure SearchFiles(const Path: String; Files: TStringList); var SR: TSearchRec; begin if FindFirst(Path + '*.*', faAnyFile, SR) = 0 then begin repeat if (SR.Name <> '.') and (SR.Name <> '..') then if (SR.Attr and faDirectory) = faDirectory then begin SearchFiles(IncludeTrailingBackslash(Path + SR.Name), Files); end else Files.Add(Path + SR.Name); until FindNext(SR) <> 0; FindClose(SR); end; end;
var Files: TStringList; I: Integer; Attr: DWORD; begin
if DirectoryExists(Path) then begin Files := TStringList.Create; try SearchFiles(IncludeTrailingBackslash(Path), Files); for I := Files.Count - 1 downto 0 do begin Attr := GetFileAttributes(PChar(Files[I])); Attr := Attr and not FILE_ATTRIBUTE_READONLY; SetFileAttributes(PChar(Files[I]), Attr); end; finally Files.Free; end; end;
end; |
megaperlz - Di 21.06.05 13:21
danke danke hat hervorragen funktioniert :-)
mfg mega
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!