[gelöst] Problem beim Formatieren eines Datenträgers

Antworten
TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

[gelöst] Problem beim Formatieren eines Datenträgers

Beitrag von TBug »

Hallo zusammen,

in einer Anwendung muss ich Dateien von einem Netzlaufwerk auf einen lokalen Datenträger (USB-Stick / SD-Karte) kopieren und vorab den Datenträger formatieren.

Das Formatieren bewerkstellige ich mit der Funktion FormatEx() aus der Windows-DLL "FMIFS" oder wahlweise mit der Funktion ShFormatDrive().

zum Problem:

Wird der Inhalt des Datenträgers bereits zum Beispiel im Windows-Explorer angezeigt, kann ich den Datenträger aus der Anwendung heraus, über den Windows eigenen Format-Dialog (ShFormatDrive()) formatieren.

Über FormatEx() jedoch bricht die Formatierung ab und gibt als Rückgabe den Hinweis zurück, dass der Datenträger bereits in Verwendung ist.


Kennt jemand eine Möglichkeit, die momentane Nutzung eines Datenträger zu unterbinden / unterbrechen, so wie es auch scheinbar der Windows-Format-Dialog macht?


viele Grüße
Zuletzt geändert von TBug am Mo 27. Jun 2022, 18:29, insgesamt 1-mal geändert.

hum4n0id3
Beiträge: 301
Registriert: So 5. Mai 2019, 15:23

Re: Problem beim Formatieren eines Datenträgers

Beitrag von hum4n0id3 »

Ich mache das entweder so:

- Medium einlegen und wenn es im Datei-Manager erscheint ("This PC") dann einen rechtsklick drauf und im Kontext-Menü, Format auswählen und formatieren.

oder (falls zb. das Medium nicht erscheinen sollte),

- "Disk Manager" starten und dort sollte das Medium mit seiner Partitionierung auftauchen. Dort kann man dann alle Partitionen löschen auf dem Medium löschen, neue erstellen usw.

Für Formatierungen habe ich bisher nie, kann mich zumindest nicht erinnern, extra Software gebraucht. Sollte ein Medium in Benutzung sein, muss die Software geschlossen werden, die auf das Medium zugreift.

Edit: Mein Windows ist English, darum verzeihung wenn ich keine deutschen Begriffe verwende, ich kenne die zum Teil auch nicht.

mfg

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Problem beim Formatieren eines Datenträgers

Beitrag von TBug »

Hallo zusammen,
hum4n0id3 hat geschrieben:
So 26. Jun 2022, 10:01
- Medium einlegen und wenn es im Datei-Manager erscheint ("This PC") dann einen rechtsklick drauf und im Kontext-Menü, Format auswählen und formatieren.

oder (falls zb. das Medium nicht erscheinen sollte),

- "Disk Manager" starten und dort sollte das Medium mit seiner Partitionierung auftauchen. Dort kann man dann alle Partitionen löschen auf dem Medium löschen, neue erstellen usw.
Klar kann man den Datenträger auch per Hand formatieren. Ebenso könnte man dann auch die Dateien danach händisch kopieren.

Das ist aber nicht der Sinn des Programmes.

Das Programm nimmt dem Benutzer alles ab. Nach dem der User das entsprechende Fahrzeug ausgewählt hat drückt er auf "Start" und der Datenträger wird entsprechend der Vorgabe mit dem im Programm hinterlegten bzw. benötigten FileSystem formatiert und im Anschluß werden die benötigten Daten auf den Datenträger kopiert.

Die so erstellten Datenträger kommen dann zum Update der Navigationsgeräte in Fahrzeugen zum Einsatz, so dass ich nicht möchte, dass die Mechaniker noch überlegen müssen, wie und mit welchen Einstellungen sie die SD-Karte oder den USB-Stick formatienen müssen und aus welchen Verzeichnissen die Daten kopiert werden sollen.


Das Formatieren via FormatEx() funktioniert ja gererell, nur jedoch momentan noch nicht, wenn von anderer Stelle aus auf den Inhalt des zu formatierenden Datenträgers zugegriffen wird.

Es muss ja eine Möglichkeit geben, da ja der interne Format-Dialog das Medium auch formatiert obwohl es im Explorer in Verwendung ist.
.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Problem beim Formatieren eines Datenträgers

Beitrag von theo »

Bin auf Linux und habe keine Ahnung, aber wer komisches Zeug machen will muss halt WinAPI googeln. :wink:
Z.B.
https://docs.microsoft.com/en-us/window ... unt_volume

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Problem beim Formatieren eines Datenträgers

Beitrag von TBug »

Hallo zusammen,
theo hat geschrieben:
So 26. Jun 2022, 13:33
aber wer komisches Zeug machen will muss halt WinAPI googeln. :wink:
Die Doku zu DeviceIoControl hatte ich mir bereits zum Teil schon zu Gemüte geführt, jedoch bin ich nicht bewusst auf FSCTL_DISMOUNT_VOLUME gestossen.
theo hat geschrieben:
So 26. Jun 2022, 13:33
Bin auf Linux und habe keine Ahnung,
Für einen Linuxer ganz schön fit im Bezug auf die WinAPI.
Da sieht man deutlich, dass Linux-User deutlich öfter mit dem mounten von Laufwerken konfrontiert werden.


Herzlichen Dank ersteinmal an Theo für den Link und den Gedankenansatz.
Was ich dort in der Doku beim Überfliegen gelesen habe kommt der Problemstellung / Lösung schon recht nahe.

Ich werde dies die Tage austesten und dann berichten!

.

hum4n0id3
Beiträge: 301
Registriert: So 5. Mai 2019, 15:23

Re: Problem beim Formatieren eines Datenträgers

Beitrag von hum4n0id3 »

Du hast ja auch mit keinem Wort erwähnt das du es für ein Programm gebraucht hast.

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Problem beim Formatieren eines Datenträgers

Beitrag von TBug »

Hallo zusammen,
hum4n0id3 hat geschrieben:
So 26. Jun 2022, 14:50
Du hast ja auch mit keinem Wort erwähnt das du es für ein Programm gebraucht hast.
:?: :?: :?:
TBug hat geschrieben:
Sa 25. Jun 2022, 22:31
in einer Anwendung muss ich Dateien von einem Netzlaufwerk auf einen lokalen Datenträger (USB-Stick / SD-Karte) kopieren und vorab den Datenträger formatieren.
TBug hat geschrieben:
Sa 25. Jun 2022, 22:31
Das Formatieren bewerkstellige ich mit der Fumtion FormatEx() aus der Windows-DLL "FMIFS" oder wahlweise mit der Funktion ShFormatDrive().

Ich dachte eigentlich dass es klar wäre, dass die Funktionen in einem Programm aufrufbar seien. :shock: :wink: :mrgreen:
.

hum4n0id3
Beiträge: 301
Registriert: So 5. Mai 2019, 15:23

Re: Problem beim Formatieren eines Datenträgers

Beitrag von hum4n0id3 »

Näh… außerdem bin ich über „aktuelle Beiträge“ hier gelandet und sah nicht, wo der Thread angelegt worden ist. Somit nicht bedacht das du es für ein Programm haben wolltest.

Passiert.

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

[gelöst] Problem beim Formatieren eines Datenträgers

Beitrag von TBug »

Hallo zusammen,

aufgrund des Hinweises von Theo konnte ich das Problem lösen. Danke dafür.

So wie die ersten Tests zeigen ist der Aufruf von DeviceIoControl() mit dem ControlCode FSCTL_DISMOUNT_VOLUME exakt das was ich gesucht habe.

Das einzige was mir bislang noch negativ auffiel ist die Tatsache, dass nach dem Dismount und dem Formatieren durch mein Programm im Windows-Explorer immer noch die "alten" Dateien angezeigt werden bis man das entsprechende Laufwerk neu anklickt.

Da muss ich mal schauen, ob ich noch eine Message hinterherschicken muss, dass der Inhalt des Laufwerkes geändert wurde.

@hum4n0id3: Alles kein Problem


Und nochmals vielen Dank für Eure schnelle Unterstützung.
.

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: [gelöst] Problem beim Formatieren eines Datenträgers

Beitrag von PascalDragon »

TBug hat geschrieben:
Mo 27. Jun 2022, 18:28
Das einzige was mir bislang noch negativ auffiel ist die Tatsache, dass nach dem Dismount und dem Formatieren durch mein Programm im Windows-Explorer immer noch die "alten" Dateien angezeigt werden bis man das entsprechende Laufwerk neu anklickt.

Da muss ich mal schauen, ob ich noch eine Message hinterherschicken muss, dass der Inhalt des Laufwerkes geändert wurde.
Du könntest dafür IOCTL_DISK_UPDATE_PROPERTIES nutzen, allerdings musst du das auf die physische Disk, statt auf das Volume machen. Die physische Disk kannst du über IOCTL_STORAGE_GET_DEVICE_NUMBER erhalten, die du dann als „\\.\PhysicalDriveX” (mit X gleich der Nummer, die du von IOCTL_STORAGE_GET_DEVICE_NUMBER in STORAGE_DEVICE_NUMBER.DeviceNumber erhalten hast) öffnest.
FPC Compiler Entwickler

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: [gelöst] Problem beim Formatieren eines Datenträgers

Beitrag von TBug »

PascalDragon hat geschrieben:
Di 28. Jun 2022, 14:00
Du könntest dafür IOCTL_DISK_UPDATE_PROPERTIES nutzen
Das sieht sehr interessant und brauchbar aus.
PascalDragon hat geschrieben:
Di 28. Jun 2022, 14:00
allerdings musst du das auf die physische Disk, statt auf das Volume machen.
Danke für den Hinweis.
Ist mir bein ersten flüchtigen Durchlesen nicht einmal bewußt aufgefallen, dass dort in der Beschreibung steht, dass DeviceIoControl bei IOCTL_DISK_UPDATE_PROPERTIES IOCTL das Device-Handle und nicht das Volume-Handle verlangt.

Werde es am Wochenende mal integrieren und testen und berichten.
Danke dafür.
.

Antworten