Autor Beitrag
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Fr 05.05.23 23:43 
Hallo,
ich zeichne Messdaten mit einem Mikrocontroller (Arduino) auf SD-Karte auf. Leider kommt es dabei aus verschiedenen Gründen vor, dass Dateien nicht lesbar sind, z. B. auch, weil sie nicht abgeschlossen wurden. Die belegten Sektoren sind in der FAT eingetragen, aber im Inhaltsverzeichnis ist Länge=0 angegeben. Der Fehler ist mit einem üblichen Diskeditor leicht zu beheben, wenigstens, wenn es nur wenige Dateien auf der Karte gibt. Vorteilhaft ist, dass jede SD-Karte vor der Verwendung formatiert wird. Aber wenn es Hunderte von Dateien auf der Karte gibt, dann ist das Rekonstruieren schon einzelner Dateien dem Diskeditor so mühsam. dass ich es noch nicht gemacht habe. Aber der Algorithmus zur Wiederherstellung ist einfach und wäre schnell in Delphi zu programmieren.

Nun meine Frage: In der Hilfe zur Windows-API zu createFile steht, das man damit auch physikalische Laufwerke öffnen könne. Das gelingt mir aber nicht. Hier mein Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
// Filename:= 'f:\DL021608\DL021608.DAT';   << Das funktioniert
 Filename:= 'f'// << Das nicht.   Auch nicht 'f:', 'F:', o.ä.
 SD:=createFile(PChar(FileName),GENERIC_READ,0,0,3,FILE_ATTRIBUTE_NORMAL,0);
 if SD = INVALID_HANDLE_VALUE then
   Memo1.lines.add('Invalid Handle')
 else
 ....


Hat da jemand eine Idee, wie das gehen könnte?

Gruß
GuaAck
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 06.05.23 08:39 
Wenn du auf den physischen Datenträger zugreifen möchtest, kannst du diesen nicht so einfach über eine logische Einheit auf diesem Datenträger (Partition) ansprechen. Dann kannst du z.B. \\.\PhysicalDrive0 verwenden. Die Liste dazu findest du über WMI in Win32_DiskDrive.

Alternativ findest du hier auch noch eine andere Zugriffsmöglichkeit über \DosDevices\ und NtCreateFile, aber die habe ich selbst nie getestet:
snipplr.com/view/249...raw-disk-access-unit
Ob das über \DosDevices\ immer geht, weiß ich nicht, denn diese Aliasnamen werden soweit ich weiß nicht immer bereit gestellt.
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Sa 06.05.23 22:29 
Danke,
auch wenn ich letztlich über einen anderen Weg gemacht habe, Dein Beitrag hat mir sehr geholfen, weil ich dadurch den Einstieg bekam und erfolgversprechende Suchbegriffe fand.

Meine Lösung basiert auf raw disk access unit. (Tipp: Bei den Angaben im Beispiel werden Cluster angegeben, nicht Sektoren!)

Danke nochmals,viele Grüße
GuaAck

Moderiert von user profile iconTh69: URL zu Link geändert.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 07.05.23 00:31 
user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
Meine Lösung basiert auf raw disk access unit. (Tipp: Bei den Angaben im Beispiel werden Cluster angegeben, nicht Sektoren!)
Ja, den Link fand ich auch interessant, weshalb ich den auch in meiner Sammlung hatte und gepostet habe, war mir aber wie ich geschrieben hatte nicht sicher, ob das so immer geht. Ich selbst hatte immer die erste Möglichkeit verwendet.

Schön, dass es funktioniert. :zustimm: