Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi USB Stick formatiern (https://www.delphipraxis.net/28928-usb-stick-formatiern.html)

Nightfly 1. Sep 2004 12:19


USB Stick formatiern
 
Kann ich das mit Delphi machen? Das auf knopfdruck ohne weiteres nachfragen der Stick (laufwerk wird zuvor abgefragt) formatiert wird?

Matze 1. Sep 2004 12:21

Re: USB Stick formatiern
 
Formatieren könne schwierig werden, wenn du einfach alles löschen willst, benutze z.B. Delphi-Referenz durchsuchenDeleteFile.

Nightfly 1. Sep 2004 12:23

Re: USB Stick formatiern
 
Ich hatte es aber auch schon das sich dateien nicht löschen ließen...u.a. wenn der stick vorschnell abgezogen wurde. Da half dan ein formatieren über den Arbeitsplatz...kann ich diese funktion von Windows nich in delphi einbauen?

Matze 1. Sep 2004 12:27

Re: USB Stick formatiern
 
Ich hab hier was gefunden.

Aber Achtung:
MP3-USB-Sticks (MP3-Player) sollten meist nicht von Windows aus formatiert werden, sonder nur mit der mitgelieferten SOftware, da sonst teilweise die Firmware gelöscht werden kann und sich der MP3-Player dann keine MP3 mehr wiedergeben kann.

Nur so am Rande, falls es ein MP3-Player ist. ;)

Nightfly 1. Sep 2004 12:31

Re: USB Stick formatiern
 
nein, sind stinknormale USB sticks die von kunden NUR zu datensicherung verwendet werden SOLLTEN...ich weiß aber schon wieder das die selber zeugs draufmachen, und dann anrufen warum die sicherung nicht geht. also will ich beim sichern: falls voll, entbehrliche alte sicherungen löschen (mach ich sowieso)..wenn nachher immer noch kein platz is...warnung ausgeben und dann plattmachen *hrrhrr*

Nightfly 1. Sep 2004 12:41

Re: USB Stick formatiern
 
HAb mir jetzt mal den COde zu gemüte geführt...leider versteh ich das mit den konstanten nich...wo kann ich ein laufwerk auswählen? warum gibt es SHFMT_DRV_A = 0; UND SHFMT_DRV_B = 1; ??? Logisch wäre mir EINE variable die den LW Buchstaben übergibt...*verwirtbin*

Matze 1. Sep 2004 12:56

Re: USB Stick formatiern
 
Zitat:

Zitat von Nightfly
verwirtbin*

mee too :mrgreen:

Ich glaube es ist so (ohne Gewähr, mach ein Backup. :lol:

Eventuell so:
Laufwerk A: SHFMT_DRV_A = 0
Laufwerk B: SHFMT_DRV_B = 1
Laufwerk C: SHFMT_DRV_B = 2
Laufwerk D: SHFMT_DRV_B = 3

...

fiasko 1. Sep 2004 12:56

Re: USB Stick formatiern
 
Zitat:

Zitat von Nightfly
Logisch wäre mir EINE variable die den LW Buchstaben übergibt...*verwirtbin*

Ist doch nur eine :-) - die SHFMT_DRV_* sind ja nur Konstanten für die Laufwerksnummern. Mußt also nurnoch die Nummer für den USB-Stick rausbekommen - ich glaube die Platten gingen dann bei 80h oder so los... aber ließ das lieber mal irgendwo nach bevor du das falsche Plattmachst :stupid:

Matze 1. Sep 2004 13:00

Re: USB Stick formatiern
 
Dazu näheres in derCode-Library. ;)

Prüfe einfach, ob das Laufwerk ein DRIVE_REMOVABLE ist, dann werden schonmal alles Wechseldatenträger aufgelistet. Ausschließen kannst du dann schonmal Buchstabe A und B.

HW764 1. Sep 2004 13:02

Re: USB Stick formatiern
 
Geht sicher auch mit dem Disketten Formatierung Kommando :-D
Delphi-Quellcode:
function TMainform.Diskette_formatieren(Laufwerk: String): Integer;
var
  Befehl             : String;
  Datei              : TextFile;
  TempDateiName      : Array [0..255] of Char;
  TempVerzeichnis    : Array [0..255] of Char;
  StartupInfo        : TStartupInfo;
  ProcessInfo        : TProcessInformation;
  SektorenProCluster : Integer;
  BytesProSektor     : Integer;
  FreieCluster       : Integer;
  ClusterInsgesamt   : Integer;
  Temp               : Integer;
begin
  // Datei zum Beantworten der Abfragen von FORMAT.EXE
  // im Temp-Verzeichnis anlegen.
  GetTempPath(255, TempVerzeichnis);
  GetTempFileName(TempVerzeichnis, 'TMP', 0, TempDateiName);

  // Antwort-Datei erzeugen
  AssignFile(Datei, TempDateiName);
  Rewrite(Datei);            // Antwort-Datei erzeugen und öffnen
  Writeln(Datei, #13#10);    // 1. Return ("Diskette einlegen ...")
  Writeln(Datei, #13#10);    // 2. Return (Diskettenbezeichnung)
  Writeln(Datei, 'n'#13#10); // keine weitere Diskette
  CloseFile(Datei);          // Datei schließen

  // Befehlszeile zum Aufrufen von FORMAT.COM
  // command.com /c = automatisch nach Beendigung schließen
  // format ... /u = unbedingt formatieren
  // format ... /c = defekte Sektoren prüfen
  Befehl := 'command.com /c format '+Laufwerk+' /u /c < '+TempDateiName;

  // StartupInfo initialisieren.
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb := SizeOf(TStartupInfo);

  // DOS-Fenster soll nicht angezeigt werden.
  StartupInfo.dwFlags := StartF_UseShowWindow;
  StartupInfo.wShowWindow := SW_Hide;

  // Formatieren
  if CreateProcess(nil, PChar(Befehl), nil, nil,
                   False, 0, nil, 'c:\',
                   StartupInfo,
                   ProcessInfo) then begin
    // Warten bis Format beendet ist.
    WaitForSingleObject(ProcessInfo.hProcess, Infinite);
    CloseHandle(ProcessInfo.hProcess);
  end;

  // Antwort-Datei wieder löschen
  DeleteFile(TempDateiName);

  // War das Formatieren erfolgreich?
  if GetDiskFreeSpace(PChar(Laufwerk), SektorenProCluster,
                      BytesProSektor, FreieCluster,
                      ClusterInsgesamt) then begin          
    // Anzahl defekter Sektoren berechnen
    Temp := FreieCluster * SektorenProCluster * BytesProSektor;
    Result := (1457664 - Temp) div BytesProSektor;
  end
  else            
    // Diskette nicht eingelegt oder unformatiert
    Result := - 1;
end;

Nightfly 1. Sep 2004 13:03

Re: USB Stick formatiern
 
dank euch, jetzt hab ich schon das richtige dialogfenster. SHFMT_DRV_B = 5 war die richtige lösung. Wo kann ich eigentlich diese windows konstatnten und funktionsaufrufe nachlesen? *dummfrag*
die krönung wäre jetzt noch wenn er automatisch beginnen würde :)

HW764 1. Sep 2004 13:04

Re: USB Stick formatiern
 
Mein Code wäre sicher besser!

Matze 1. Sep 2004 13:04

Re: USB Stick formatiern
 
Zitat:

Zitat von Nightfly
...die krönung wäre jetzt noch wenn er automatisch beginnen würde :)

Wie meinst du das?

HW764 1. Sep 2004 13:12

Re: USB Stick formatiern
 
Einfach in Form.create machen :-D

Matze 1. Sep 2004 13:14

Re: USB Stick formatiern
 
Falls du die Nachfrage, ob man's formatieren soll, meinst, dann steht auf der Seite, auf die ich verlinkt habe:

Zitat:

Zitat von SDC
{
Normally, if a diskette is not in the drive when SHFormatDrive is called,
the system displays a critical error dialog box that asks the user
to Abort, Retry, or Ignore.
You can prevent the system from displaying this dialog box by calling
the SetErrorMode API with SEM_FAILCRITICALERRORS.
}

Edit: Hups, war doch net richtig. :oops:

Nightfly 1. Sep 2004 13:27

Re: USB Stick formatiern
 
na jetzt kommt bloß das fenster, wo der nutzer nochmal das laufwerk wählen kann, datisystem einstellen u.s.w.... und dann auf start drücken muß. Diesen schritt hätt ich gern noch automatisiert, ähnlich wie beim Automatischen verbinden mit dem Internet: da wird auch das standartwindowsfenster verwendet, aber "wählen" wird durch eine mysteriöse macht gedrückt...kann die auch start im format dialog drücken?


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz