![]() |
Error 1026 bei ShFileOperation
hi @ all
hab grad ein kleines problem.... bastel mir im moment ein kleines programm für installationen und updates von programmen... gerade versuch ich für ein programm eine update routine zu machen, bis jetzt sieht das ganze so aus:
Delphi-Quellcode:
die .exe tu ich wie ihr seht via filestream kopieren... das klappt auch soweit ganz gut...
procedure TMain_Form.bitbtn_Upd_ProgClick(Sender: TObject);
var strExeFrom, strExeTo : TStream; sFromDirError, sToDirError : String; FileOpStruct : TSHFileOpStruct; iRC : Integer; begin // Copy DELGSRV201.exe strExeFrom := TFileStream.Create('J:\Update\Prog\Prog1.exe', fmOpenRead); Try strExeTo := TFileStream.Create('C:\LOG\Daten_Laden\bin\Prog1.exe', fmCreate); Try strExeTo.CopyFrom(strExeFrom, strExeFrom.Size); Finally strExeTo.Free; End; Finally strExeFrom.Free; End; //Copy Directory sFromDirError := 'J:\Updates\Daten_Laden\Error'; sToDirError := 'C:\LOG\Daten_Laden\'; With FileOpStruct Do Begin wFunc := FO_Copy; pFrom := PChar(sFromDirError + #0); pTo := PChar(sToDirError + #0); End; iRC := SHFileOperation(FileOpStruct); end; aber beim kopieren der ordner klappt irgendwas nicht, da bekomm ich immer denn fehler nr. 1026 kann mir vielleicht jemand sagen worand das liegt??? |
Re: Error 1026 bei ShFileOperation
Bist du sicher dass es 1026 ist? Was bekommst du denn angezeigt, wenn du dir mal den Text anzeigen lässt zu dem Fehlercode? 1026 ist nämlich ein nicht definierter Fehlercode. Und woher eißt du dass es 1026 ist? Du weißt zwar iRC den Rückgabewert von SHFileOperation zu, benutzt sie aber nicht weiter. Da bin ich mir nicht so sicher, ob man dem Inhalt trauen kann, weil sie eigentlich wegoptimiert wird. Desweiteren steht im PSDK:
Zitat:
|
Re: Error 1026 bei ShFileOperation
oh :oops: ok dann war das wohl nicht der richtige fehler ^^
also ich krieg folgende fehlermeldung wenn ich GetLastError und SysErrorMessages mach: "Datei kann nicht kopiert werden: 'Die Quelldatei oder vom Quelldatenträger kann nicht gelesen werden.'" aber leider sagt mir der fehler auch nicht viel :pale: |
Re: Error 1026 bei ShFileOperation
Zitat:
'J:\' ist ein netzwerklaufwerk, bzw. das laufwerk eines anderen pc's das ich mir gemappt hab falls das der fehler ist, hat jemand eine idee, wie ich dann die daten bzw. einen kompletten ordner kopieren könnte??? |
Re: Error 1026 bei ShFileOperation
nachdem ich des jetzt mit SHFileOperation net hinbekommen hab was ich machen wollt, hab ich mir mehrere funktionen und proceduren programmiert die des ganze für mich erledigen...
hier mein code, vielleicht kanns jemand anders au mal gebrauchen ;)
Delphi-Quellcode:
wer fragen hat kann sich gerne melden ;)
procedure TMain_Form.bitbtn1Click(Sender: TObject);
var sDir, sFolderError, sFromDir, sSearchDir, sToDir : String; bl : Boolean; begin // Copy Error Folder [If not Exists, Create Error Folder, Copy Files] sDir := 'C:\LOG\Daten_Laden\Error'; bl := fnDirExists(sDir); If bl = False Then Begin CreateDir(sDir); // Ordner anlegen End Else Begin prCheck_ClearFiles(sDir);//Ordner ist bereits vorhanden, Files aus Ordner löschen! End; sFromDir := 'J:\Update\Prog1\Error\'; sSearchDir := 'J:\Update\Prog1\Error\*.txt'; sToDir := 'C:\LOG\Daten_Laden\Error\'; prCopyFiles(sFromDir, sSearchDir, sToDir); ProgBar.Position := 60; // Copy File Folder [If not Exists, Create File Folder, Copy Files] sDir := 'C:\LOG\Daten_Laden\Files'; bl := fnDirExists(sDir); If bl = False Then Begin CreateDir(sDir); End Else Begin prCheck_ClearFiles(sDir); End; sFromDir := 'J:\Update\Prog1\Files\'; sSearchDir := 'J:\Update\Prog1\Files\*.txt'; sToDir := 'C:\LOG\Daten_Laden\Files\'; prCopyFiles(sFromDir, sSearchDir, sToDir); ShowMessage('Update was Successful'); end; //****************************************************************************** // Examine Folder Exists //****************************************************************************** function TMain_Form.fnDirExists(sDir : String) : Boolean; begin fnDirExists := DirectoryExists(sDir); // Prüft ob Ordner bereits angelegt wurde end; //****************************************************************************** // Clear Files From Folder //****************************************************************************** procedure TMain_Form.prCheck_ClearFiles(sDir : String); var iAtr, iRC : Integer; sPath, sFile : String; recDat : TSearchRec; bl : Boolean; begin sPath := sDir + '\*.txt'; iAtr := faAnyFile; iRC := FindFirst(sPath, iAtr, recDat); // Erste Datei suchen If iRC = 0 Then // Datei gefunden Begin sFile := sDir + '\' + recDat.Name; bl := DeleteFile(sFile); // Datei löschen If bl = False Then Begin ShowMessage('Could Not Delete: ' + sFile); End; End; While iRC = 0 Do Begin iRC := FindNext(recDat); // Nach weiteren Dateien suchen If iRC = 0 Then Begin sFile := sDir + '\' + recDat.Name; bl := DeleteFile(sFile); // Weitere Dateien vorhanden, Dateien löschen If bl = False Then Begin ShowMessage('Could Not Delete: ' + sFile); End; End; End; FindClose(recDat); // Ende der Suche end; //****************************************************************************** // Copy Files From Dir --> To Dir //****************************************************************************** procedure TMain_Form.prCopyFiles(sFromDir, sSearchDir, sToDir : String); var iAtr, iRC : Integer; sPath : String; recDat : TSearchRec; strFrom, strTo : TStream; begin iAtr := faAnyFile; sPath := sSearchDir; iRC := FindFirst(sPath, iAtr, recDat); // Erste Datei im 'Von' Ordner suchen If iRC = 0 Then // Datei kopieren Begin strFrom := TFileStream.Create(sFromDir + recDat.Name, fmOpenRead); Try strTo := TFileStream.Create(sToDir + recDat.Name, fmCreate); Try strTo.CopyFrom(strFrom, strFrom.Size); Finally strTo.Free; End; Finally strFrom.Free; End; End; While iRC = 0 Do Begin iRC := FindNext(recDat); // Nächste Datei suchen If iRC = 0 Then // Datei kopieren Begin strFrom := TFileStream.Create(sFromDir + recDat.Name, fmOpenRead); Try strTo := TFileStream.Create(sToDir + recDat.Name, fmCreate); Try strTo.CopyFrom(strFrom, strFrom.Size); Finally strTo.Free; End; Finally strFrom.Free; End; End; End; FindClose(recDat); // Ende der suche / des kopierens end; |
Re: Error 1026 bei ShFileOperation
Moin Andreas,
ein paar Dinge sind mir aufgefallen. Das Zielverzeichnis endet auf \. Auch wenn das nichts ausmachen dürfte, wäre es sauberer. Ausserdem hast Du die Variable FileOpStruct nicht initialisiert. Da es sich um eine lokale Variable handelt, steht in den nicht von Dir überschriebenen Feldern u.U. Datenmüll.
Delphi-Quellcode:
Sollte noch vor dem Befüllen der Struktur stehen, um die Struktur zu initialisieren.
FillChar(FileOpStruct,SizeOf(FileOpStruct),0);
Der letzte Punkt: Da Du eh' nur die Dateien eines Verzeichisses kopieren willst, ohne Unterverzeichnis, solltest Du das auch angeben. Für Deinen Anwendungsfall sähe das bei mir so aus:
Delphi-Quellcode:
Die Flags könnten natürlich noch, je nach Bedarf, zusammengestrichen/erweitert werden (z.B. speziell im ersten Teil könnte ein FOF_RENAMEONCOLLISION zusätzlich sinnvoll sein)
function TMain_Form.bitbtn_Upd_ProgClick(Sender: TObject) : integer;
var FileOpStruct : TSHFileOpStruct; begin FillChar(FileOpStruct,SizeOf(FileOpStruct),0); FileOpStruct.wFunc := FO_COPY; FileOpStruct.fFlags := FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_NOERRORUI or FOF_NORECURSION or FOF_SILENT; FileOpStruct.pFrom := PChar('J:\Update\Prog\Prog1.exe'+#00); FileOpStruct.pTo := PChar('C:\LOG\Daten_Laden\bin\Prog1.exe'+#00); Result := SHFileOperation(FileOpStruct); if Result <> 0 then exit; FillChar(FileOpStruct,SizeOf(FileOpStruct),0); FileOpStruct.wFunc := FO_COPY; FileOpStruct.fFlags := FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_NOERRORUI or FOF_NORECURSION or FOF_SILENT; FileOpStruct.pFrom := PChar('J:\Updates\Daten_Laden\Error\*.*'+#00); FileOpStruct.pTo := PChar('C:\LOG\Daten_Laden'+#00); Result := SHFileOperation(FileOpStruct); end; |
Re: Error 1026 bei ShFileOperation
danke chriss für deinen beitrag...
werds bei gelegnheit mal ausprobieren, kann nur noch nicht sagen wann, da ich des programm jetzt scho fertig hab, und ich des zum testen wieder bisl umbasteln muss... aber dankschee nommel.... :thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 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