Einzelnen Beitrag anzeigen

Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#20

Re: Bandlaufwerk / Streamer ansprechen unter Delphi.

  Alt 10. Nov 2005, 08:00
Wieso habe ich denn Gestern deine neuen Beiträge nicht mitbekommen

Zitat von shifter:
Flocke nicht aufregen,

Delphi-Quellcode:
Var str : TMemoryStream;
    ou : dword;
    lcm : pointer;
begin
    TapeHandle := OPENDRIVE;

    str := TMemoryStream.Create;
    str.LoadFromFile('C:\mt.exe');

    lcm := nil;
    ou := 0;

    showmessage(inttostr(str.Size)); // Länge des mt.exe = 23040

    BackupWrite( TapeHandle,str.Memory,str.Size,ou, false,false, lcm );

    showmessage(inttostr(ou)); // Geschriebene länge = 204

    BackupWrite( TapeHandle,str.Memory,str.Size,ou, true,false, lcm );


    str.Free;

    CLOSEDRIVE;
Passiert nichts. Irgend wo mache ich noch fehler.
Zunächst einmal (war mir vorher gar nicht so aufgefallen) - man benutzt die Funktionen BackupRead und BackupWrite dazu, die eigentlichen Dateien auf der Festplatte auszulesen und zu schreiben, und nicht das Band. Das Band wird einfach mit WriteFile beschrieben und mit ReadFile gelesen.

<Hinzugefügt>
Mit BackupRead liest man nicht nur die reinen Daten einer Datei, sondern alle Streams (z.B. die ACLs, also die Zugriffsrechte). Dabei bekommst du für jeden Stream jeweils eine WIN32_STREAM_ID-Struktur inkl. des Namens und im Anschluss daran die Daten des Streams, deren Größe im Feld Size angegeben ist (evtl. plus Füll-Bytes, um auf 32-Bits auszurichten).

Wenn du also alle Daten, die du mit BackupRead liest, mit BackupWrite wieder schreibst, dann stellst du nicht nur den Inhalt der Datei wieder her sondern auch alle anderen Attribute.
</Hinzugefügt>

Zitat von shifter:
Andere Frage,

Was ist TapeMark ? Ist das änlich mit cluster auf hdd ?

Gruss
seba
Mit WriteTapeMark kannst du Markierungen auf das Band schreiben, z.B. den Beginn einer neuen Datei kennzeichnen. Mit SetTapePosition kannst du dann eine bestimmte Markierung gezielt ansteuern.

Zitat von shifter:
Bei dem MT.EXE SourceCode habe ich folgendes :

Code:
SetTapePosition( tapedrive, TAPE_ABSOLUTE_BLOCK,0,(DWORD)(position & 0xffffffff),
   (DWORD)((position >&gt; 32) &amp; 0xffffffff),FALSE)
Da ich von C nichts verstehe wie kann man es übersetzten?
(DWORD)(position & 0xffffffff)
und
(DWORD)((position >> 32) & 0xffffffff)

Es handelt sich hierbei um
Zitat:
dwOffsetLow
[in] Low-order bits of the block address or count for the position operation specified by the dwPositionMethod parameter.
dwOffsetHigh
[in] High-order bits of the block address or count for the position operation specified by the dwPositionMethod parameter. If the high-order bits are not required, this parameter should be zero.
Gruss
Seba
(DWORD)(position & 0xffffffff) - die unteren 32 Bits
(DWORD)((position >> 32) & 0xffffffff) - die oberen 32 Bits

Wenn du nur mit Integer arbeitest (für Dateizähler bzw. Dateigröße), dann kannst du für dwOffsetHigh einfach 0 angeben.

Wenn du mit Int64 arbeitest, dann nimm LARGE_INTEGER(Zahl).LowPart und LARGE_INTEGER(Zahl).HighPart
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat