Dateibearbeitung mit Ruby


Sie sind hier: RubyDateibearbeitung mit Ruby


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.

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

Noch nicht analysiert: