![]() |
XCOPY mit Delphi nachbauen
Hi,
wie kann ich eine Gruppe von Dateien am besten kopieren (samt Unterverzeichnissen und von CD) ? Also per shellexecute oder so. Bietet Delphi da nicht für diesen Zweck was eigenes an ? :gruebel: Ich komme nicht drauf. 8) FileCOpy oder CopyFile findet zumindest die OH nicht. |
Re: XCOPY mit Delphi nachbauen
![]() ![]() Wenn es um mehrere Dateien geht, ist vielleicht das was für dich: ![]() |
Re: XCOPY mit Delphi nachbauen
@Hansa:
Wie viele Jahre programmierst du nochmal? :mrgreen: Es gibt viele Wege Dateien zu kopieren: Du könntest dir zum Beispiel eine Funktion schreiben, die dir eine Datei von a nach b kopiert. Hier mal ein paar Funktionen: a. FileCreate(), FileOpen(), FileClose(), FileRead() und FileWrite() b. AssignFile(), CloseFile(), BlockRead() und BlockWrite() c. Die Verwendung der Klasse "TFileStream" d. CopyFile(), MoveFile(), DeleteFile() und CreateFile() Zum suchen von Dateien gibt es die Funktion FindFirst() sowie FindNext(). edit: MKDir() - erstellt einen Ordner DirectoryExists() - prüft ob ein Ordner existiert FileExists() - prüft ob eine Datei existiert |
Re: XCOPY mit Delphi nachbauen
Zitat:
Das witzige an ![]() Ich bin mir fast sicher, daß es in der DP auch was zum Thema ![]() |
Re: XCOPY mit Delphi nachbauen
hi olli,
woher willst du wissen, das diese Funktionen schneller sind? Ein gutes Beispiel wäre hier DCopy von mirkes.de. ![]() //edit: Angefangen hab ich mit RapidQ-Basic 1999 und du :zwinker: |
Re: XCOPY mit Delphi nachbauen
Zitat:
Zitat:
|
DP-Maintenance
Dieses Thema wurde von "alcaeus" von "Windows 9x / ME / 2000 / XP / 2003" nach "Windows API / MS.NET Framework API" verschoben.
Die Windows-Sparte ist nicht fuer Delphi-Fragen. Sowas gehoert in die Delphi-spezifischen Sparten ;) |
Re: XCOPY mit Delphi nachbauen
Zitat:
Zitat:
Dann seit ihr ja noch junge Hasen beim Programmieren. :???: |
Re: XCOPY mit Delphi nachbauen
Zitat:
|
Re: XCOPY mit Delphi nachbauen
Zitat:
![]() [edit="hinzugefügt"] Zitat:
Wenn jeder alles wüsste, gäbe es dieses Forum nicht. Außerdem zeigt es das Du die Suche Funktion der DP nicht nutzt. :stupid: (Ok, Hansa hat sie auch nicht benutzt ;-) ) [equote="Hansa hat folgendes geschrieben: ( ![]() |
Re: XCOPY mit Delphi nachbauen
Ich dürfte euch bitten zum Thema zurückzufinden und das Thema weiter sachlich zu diskutieren. Danke.
|
Re: XCOPY mit Delphi nachbauen
[ot]
Zitat:
Die XCopy-Frage finde ich absolut berechtigt, nur nicht die Art und Weise, wie gefragt wurde. :| Zitat:
[/ot] @Hansa: Hast du schon eine Lösung gefunden oder interessiert dich der Thread nicht mehr? :cry: |
Re: XCOPY mit Delphi nachbauen
Im allerersten Beitrag steht, daß ich in der OH gesucht und nichts gefunden habe. Also, wonach soll ich denn in der DP suchen ? :roll: Außerdem brauchen doch die Kleinen auch mal ihre Gummibärchen. :stupid:
Ich glaube es sind nur 10 Dateien zu kopieren und 2 Ordner anzulegen. Deshalb ist die Frage aufgetaucht, ob man nicht eine BAT verwenden sollte und dann einfach mit shellexecute diese aufrufen kann ? Hat einer irgendwo ein Beispiel für diesen Fall ? |
Re: XCOPY mit Delphi nachbauen
Zitat:
![]() Du kannst ja direkt ShellExecute aufrufen:
Delphi-Quellcode:
oder
ShellExecute (0,'open','xcopy.exe','*.* C:\TEMP\*.*','.',SW_SHOW);
Delphi-Quellcode:
oder
ShellExecute (0,'open','cmd.exe','/C"copy *.* C:\TEMP\*.*"','.',SW_SHOW);
Delphi-Quellcode:
bzw
ShellExecute (0,'open','HansaSuperCopy.bat','','C:\TEMP',SW_SHOW);
Delphi-Quellcode:
Und die HansaSuperCopy.bat:
ShellExecute (0,'open','cmd.exe','/C"C:\Temp\HansaSuperCopy.bat"','C:\TEMP',SW_SHOW);
Code:
@echo off
rem HansaSuperCopy copy Datei1.ext C:\TEMP\Eins\Datei1.ext copy Datei2.ext C:\TEMP\Eins\Datei2.ext copy Datei3.ext C:\TEMP\Zwei\Datei3.ext copy Datei4.ext C:\TEMP\Zwei\Datei4.ext ... |
Re: XCOPY mit Delphi nachbauen
Thx Mabuse. Auf Dich ist wenigstens noch Verlaß. :mrgreen: Mir schwebt die Variante 3 vor. Weil unter W98 hieß CMD noch COMMAND. Jetzt gibt es allerdings folgendes Hindernis : es sieht aus, als ob nichts passiert. Wie sehe ich denn das Ergebnis von dem was in dem shellexecute gemacht wird ? In diesem Fall wäre ich wohl mit Try and Error am schnellsten fertig. 8)
|
Re: XCOPY mit Delphi nachbauen
So, das geht jetzt wie gewünscht. Aber nur fast ! :mrgreen: Eventuell muß ich noch was wissen.
|
Re: XCOPY mit Delphi nachbauen
Moin Hansa,
Zitat:
Damit hast Du dann den jeweiligen Pfad zum Kommandoprozessor, und das unabhängig von der Windowsversion. Diese Variable gab es IMHO schon unter "echtem" DOS. Ausserdem steht Dir auch SHFileOperation zur Verfügung. Dafür haben wir, meines Wissens, sogar eine gekapselte Version in der Code-Lib stehen. |
Re: XCOPY mit Delphi nachbauen
Warum das ? Ich umgehe das ganz einfach mit abgewandelter Mabuse Variante 3. :mrgreen:
Delphi-Quellcode:
Habe also nur die Parameter benutzt und kein Default-Verzeichnis. In der Bat steht dann %1 und %2 drin. Allerdings noch eine kleine Frage. Den schwarzen Bildschirm würde ich gerne ersetzen. Wie komme ich an die Shellexecute-Ausgabe ran ? Geht das ?
ShellExecute (0,'open','Demoinst.bat','E: C:','',SW_NORMAL);
|
Re: XCOPY mit Delphi nachbauen
Moin Hansa,
wenn Du Dir absolut sicher sein kannst, dass die Datei so gefunden wird... Hast Du es schon einmal mit SW_HIDE versucht? [EDIT] Ich hoffe doch mal, dass die Laufwerksbuchstaben in der Realität variabel gehalten sind ;-) [/EDIT] |
Re: XCOPY mit Delphi nachbauen
Zitat:
Ohne Arme keine Kekse. Ääh ich mein: Ohne Frage keine Antwort :mrgreen: |
Re: XCOPY mit Delphi nachbauen
Natürlich ist das nicht fest. Ich lasse das aus ComboBoxen auswählen :
Delphi-Quellcode:
In der Ziel-Combo steht der Laufwerksbuchstabe und der freie Platz auf der Platte. Das reicht.
ShellExecute (0,'open','Demoinst.bat',
PChar (cboQuellLW.Text+' '+cboZielLW.Text),'',SW_NORMAL); Allerdings will ich eine Protokolldatei haben, um anzuzeigen, was jetzt genau kopiert wurde und wohin. Ich bräuchte also die Aúsgabe von dem Shellexecute. Das kopieren dauert mind. 30 Sek. Das ist massig Zeit für einen DAU das Ausgabefenster einfach so zu schließen. 8) Mit SW_HIDE wäre das zu umgehen, aber dann besteht die Gefahr, daß wegen anscheinendem "Rechner hängt" ein DAU sogar den Rechner abschaltet, weil er nichts sieht. 8) |
Re: XCOPY mit Delphi nachbauen
Zitat:
Dann wirst Du wohl doch etwas Delphi programmieren müssen. ;-) Die Funktionen zum Kopieren in Delphi wurden ja weiter oben schon angesprochen... |
Re: XCOPY mit Delphi nachbauen
Du meinst mit Blockread usw. ? :gruebel: Der Rest sind ja auch nur WinApi Sachen.
|
Re: XCOPY mit Delphi nachbauen
Zitat:
Hast Du Angst vor der Win32 API ?
Delphi-Quellcode:
uses ShellAPI;
function MyCopy(Quelle, Ziel: string):Boolean; var fos: TSHFileOpStruct; begin ZeroMemory(@fos, SizeOf(fos)); with fos do begin wFunc := FO_COPY; fFlags := FOF_FILESONLY // nur Dateien wenn Wildcard (*.*) verwendet werden or FOF_NOCONFIRMATION; // Keine Abfrage, es wird JA angenommen (z.B. überschreiben) pFrom := PChar(Quelle + #0); pTo := PChar(Ziel) end; Result := (0 = ShFileOperation(fos)); end; procedure TForm1.Button1Click(Sender: TObject); begin // if myCopy('C:\TEMP\*.*', 'C:\Verzeichnis) then caption := 'OK' else Caption := 'ERR'; // oder für jede Datei einzeln... if myCopy('C:\TEMP\EinzelneDatei.ext', 'C:\Verzeichnis') then caption := 'OK' else Caption := 'ERR'; end; |
Re: XCOPY mit Delphi nachbauen
Angst ? Ne. Aber Mabuse, Dein Source ist mir zu WinApi lastig. :mrgreen: Außerdem hat mein Programm einen Denkfehler. Warum soll ich das Quelllaufwerk abfragen, wenn das Setup-Programm von einer CD gestartet wird ? :zwinker: Wie komme ich nun an dieses dran, also das aktuelle ?
Delphi-Quellcode:
So gehts nicht. Der zeigt mir dann "A" an. Habe gedacht 0 wäre immer das aktuelle. 8)
procedure TForm1.ErmittleAlleLW;
var l: byte; begin l := GetLogicalDriveStrings(SizeOf(LWs), LWs); QuellLW := LWs [0]; |
Re: XCOPY mit Delphi nachbauen
Äh, du weißt aber dass du mit ParamsStr(0) Verzeichnis und Anwendungsnamen bekommst?
|
Re: XCOPY mit Delphi nachbauen
moin hansa,
den programmpfad bekommst du doch über ParamStr(0); *schnipp, Lösung wieder entfernt :P* |
Re: XCOPY mit Delphi nachbauen
Zitat:
Wenn Du ein Form1.Show; programmiert macht Du ja im Grunde auch nur einen WinAPI Aufruf. Deine Programme laufen unter Windows -> Windoes funktioniert nun halt mal "nur" mit WinAPI Aufrufen! WEnn in Deinen Programmen keine WinAPI Aufrufe enthalten sein sollen, mußt Du unter Dos oder Linux oder MacOS programieren. Zitat:
Zitat:
An den Laufwerksbuchstaben kommst Du auch relativ leicht:
Delphi-Quellcode:
Aber Vorsicht es gibt Leute (wie mich :-)) die auf ein CD-ROM Laufwerk auch direkt über den UNC Namen zugreifen, in dem Fall gibt es keinen Laufwerksbuchstaben des CD-ROMs.
function ExtractFileDrive(const FileName: string): string;
z.B.: \\SERVER\CDROM\setup.exe -> ExtractFileDrive(Application.ExeName) = '' Oder dem CD-ROM ist kein Laufwerksbuchstabe zugewiesen, aber das CD-ROM wurde in ein Verzeichnis gemountet. z.B. C:\CDROM\setup.exe -> ExtractFileDrive(Application.ExeName) = 'C:' C: ist aber nicht das CD-ROM Laufwerk, sondern die Festplatte (obwohl ja auf das CD-ROM zugegriffen wurde) Oder der Kunde hat den Inhalt der CD ganz einfach in ein Verzeichnis auf der Festplatte kopiert. Es ist also besser mit folgender Funktion den kompletten Pfad zu ermitteln und dann mit relativen Pfadangaben zu arbeiten.´
Delphi-Quellcode:
z.B.: Quelle ist das Quellverzeichnis der Daten:
function ExtractFilePath(const FileName: string): string;
Delphi-Quellcode:
Es kann dann z.B. so ein Pfad entstehen: 'E:\Install\..\Daten\' der aber funktioniert. (Ist das gleiche wie 'E:\Daten')
Quelle := ExtractFilePath(Application.ExeName)+'..\Daten\';
Ich hoffe diese Infos helfen Dir. |
Re: XCOPY mit Delphi nachbauen
Zitat:
Es steht ja alles schon in der DP und es gibt ja die Such Funktion... Aber jetzt wo ich das alles schon mal getippt habe, lasse ich es drin. |
Re: XCOPY mit Delphi nachbauen
Ja, Paramstr (0) enthält ja auch den Laufwerksbuchstaben. 8) Wie bin ich nur darauf gekommen, da wäre nur der Pfad drin ? :gruebel:
Delphi-Quellcode:
Das wäre die Mabuse-Version. Der müßte dann eben nachlesen, wo was hin muß. :mrgreen:
QuellLW := ExtractFileDrive(ParamStr (0));
if QuellLW = '' then begin showmessage ('Kein CD-Laufwerk bzw. kein Laufwerksbuchstabe gefunden !'#10#13#10#13+ 'Sollten Sie die CD mit einem gemappten Laufwerk benutzen, oder'#10#13+ 'wollen Sie von Festplatte installieren, so lesen Sie sich bitte die Datei'#10#13+ 'INSTALL.TXT auf der CD durch.'); Close; end; |
Re: XCOPY mit Delphi nachbauen
Zitat:
Lies mein Post oben mal bis zum Ende. Ich sagte das folgendes besser ist:
Delphi-Quellcode:
Ich würde es nicht so machen wie Du es mir in den Mund legst.
Quelle := ExtractFilePath(Application.ExeName)+'..\Daten\';
(Außerdem habe ich im Gegensatz zu Anderen keine Angst vor Win32 API Funktionen!) So das musste mal gesagt werden. [edit] ps: Abgesehen davon würde ich in einem Pojekt keine Hardcodes verwenden, sondern z.B. den Fehlertext als ResourceString oder wenigstens als Konstante in einer "*const.pas" Unit definieren. [/edit] |
Re: XCOPY mit Delphi nachbauen
Jaja, das habe ich falsch hingeschrieben. 8) Das wäre die Version für Mabuse. In der INSTALL.TXT steht allerdings auch nur folgendes drin :
"Kopieren Sie den kompletten Ordner DEMO von der CD in ein Verzeichnis Ihrer Wahl." Wer das nicht packt, auf den verzichte ich lieber freiwillig. |
Re: XCOPY mit Delphi nachbauen
So hier nochmal mal meine Variante:
Delphi-Quellcode:
Zur Sicherheit könntest du am Ende DirectoryExists() aufrufen.
function GetAppDevice: String;
var i, p: Integer; s: String; begin i := 0; p := 0; s := ParamStr(0); if s <> '' then begin repeat inc(i); if s[i] = '\' then begin p := i; break; end; until s[i] = #0; end; if p = 0 then Result := '' else Result := Copy(s, 1, p); end; |
Re: XCOPY mit Delphi nachbauen
Zitat:
Zitat:
Prüfen ob der Laufwerksbuchstabe ein CD-ROM Laufwerk ist (Devicetyp) macht auch keinen Sinn, da ein Laufwerk über Netz oder einfach mit Subst gemoutet sein kann.
Code:
Das Laufwerk R: hat in dem Beispiel den Typ eines Netzwerklaufwerks.
subst R: C:\CDROM
(Obwohl es ja das in das Verzeichnis c:\CDROM gemountete lokale CD-ROM Laufwerk ist) Das DirectoryExists sagt ja nur aus, das es das Laufwerk gibt, nicht was dahintewr steckt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:47 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