Anmerkungen zur Dateibearbeitung mit Ruby
Alle die folgenden Anmerkungen beziehen sich auf Windows XP.
Länge des Pfades
Maximal 255 Zeichen sind erlaubt.
Bei geeignet langen Verzeichnissen wird die Datei erst gelesen, der Test sagt anschliessend, das die Datei nicht existiert.
Dir["#{path}/*"].each{|f| puts "#{f.size}\t#{f.inspect}" puts File.exist?(f) puts FileTest.exist?(f) puts FileTest.size(f) }
Beim Erstellen eines Beispiels klappt das Anlegen ab gewissen Längen auch nicht mehr.
1.upto(15){|i| dir ="Verzeichnis_%02i" % i Dir.mkdir dir if ! File.exist? dir Dir.chdir dir f = File.new( 'test.txt', 'w' ) f.close }
in `mkdir': No such file or directory - Verzeichnis_15 (Errno::ENOENT)
Siehe auch einen Thread bei Rubyforen.de
Zeitstempel
Zeitstempel setzen:
File.utime( time,time, filename )
Infos zu File.Install
require 'ftools' ref.install( fromName, toName, aMode=nil, verbose=false )
Copies file fromName to file toName using File.syscopy , unless toName already exists and has the same content as fromName. Sets the mode of the resulting file to aMode unless aMode is nil.
- toName: Kann ein Verzeichnis sein, Der Dateiname bleibt erhalten.
- aMode: erlaubt das setzen von Schreib- und Leserechten.
- verbose: Mit true wird eine Info ausgegeben.
Vergleich
File#install berücksichtigt nicht den Zeitpunkt der letzten Änderung. Ein Überschreiben neuerer Daten ist möglich.
Ist es relevant, muss man selbst einen Test auf neuere Dateien machen.
test( ?>, file1, file2) file1.stat > file2.stat
Änderungsdatum bei File#install
Das letzte Änderungsdatum ist der Zeitpunkt des Kopierens. Oder anders formuliert: Das letzte Änderungdatum wird nicht mitkopiert.
Ist das wichtig, dann muss das Änderungsdatum nachträglich angepasst werden:
begin File.utime(File.mtime(from), File.mtime(from), tofile ) rescue Errno::EACCES => bang puts "#{tofile} - #{Write protected?}" end
Das funktioniert nur, wenn die Datei nicht schreibgeschützt ist.
Dateiberechtigungen (Mode)
Der Mode einer Datei ist ermittelbar mit:
File.stat( filename ).mode
Returns an integer representing the permission bits of statfile. The meaning of the bits is platform dependent
Ergebnis ist eine Integer-Zahl, die als Bitmuster oder Oktalzahl zu interpretieren ist. Die letzten drei Oktal-Ziffern (oder die hinteren drei Binär-Tripel) definieren Zugriffsrechte. Die anderen Ziffern definieren den Dateityp (einfach, Verzeichnis, pipe, socket)
Auf Unix-basierten Systemen werden Berechtigungen für Besitzer, Gruppen und alle anderen vergeben, es ist jeweils definierbar, ob jemand Schreib-, Lese- oder Ausführberechtigung hat.
Windows hat eingeschränkte Möglichkeiten. Gruppen und Andere dürfen nur lesen, bei den Besitzern kann bestimmt werden, ob sie schreibberechtigung haben oder nicht, Leseberechtigung besteht immer.
Die folgende Tabelle sollte nicht dazu verwendet werden in einem Programm eine Berechtigungs- oder Typprüfung für Dateien aufzubauen. Dazu gebt es geeignetere Methoden der Klasse File::Stat (zum Teil auch in der Klasse File verfügbar).
Tabelle mit File::Stat-Werten (Zellen mit ? habe ich noch nicht analysiert):
Datei | Verzeichnis | ? | IO | ? | ? | ? | Owner | Group | All | |
Wert | 1/0 | 1/0 | 1/0 | 1/0 | 1/0 | 1/0 | 1/0 | rwx | rwx | rwx |
binär: | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 110 | 100 | 100 |
oktal: | 1 | 0 | 0 | 6 | 4 | 4 |
Beispiele verschiedener Dateien:
oktal Binärdarstellung owner grp all F D?I ??? rwx rwx rwx 40755 0 100 000 111 101 101 dir 100644 1 000 000 110 100 100 test.txt 100644 1 000 000 110 100 100 ./test_kein Archivflag.txt 100644 1 000 000 110 100 100 ./test_keine_Indizierung.txt 100444 1 000 000 100 100 100 test_schreibgeschuetzt_versteckt.txt 10000 0 001 000 000 000 000 $stdin 10000 0 001 000 000 000 000 $stdout 10000 0 001 000 000 000 000 $stdout
Nicht gefunden/Nicht per File#stat ermittelbar
- Archivflag
- Keine Indizierung
- Kompremierungsflag (Datei wird blau angezeigt im Explorer)
- Verschlüsselt (Datei wird grün angezeigt im Explorer)
Noch nicht analysiert:
- File#pipe?
- File#socket?
- File#sticky?