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 Arbeiten mit "ShFileOperation" --> ab 2ten Mal verweigert (https://www.delphipraxis.net/77087-arbeiten-mit-shfileoperation-ab-2ten-mal-verweigert.html)

Jlagreen 14. Sep 2006 14:28


Arbeiten mit "ShFileOperation" --> ab 2ten Mal
 
Hallo,

also ich arbeite seit einigen Monaten an meiner Diplomarbeit und bin auch fast fertig. Meine Aufgabe bestand/besteht darin eine Anlage zu bauen, die über ein Handling DVDs bewegt, ablegt und brennt. Sie wird im Deutschen Museum zum Einsatz kommen in einem Labor für Schüler.

Funktioniert auch alles soweit und ich bin grad am "Feintuning" der Delphi-Anwendung zu diesem Zweck :).

Mein Problem ist:

Da ich die Daten zum Brennen aus einem Netzwerk des Deutschen Museums holen muss und ich derzeit aber bei meiner Firma in Stuttgart bin, habe ich das grad etwas "trivial" gelöst, in dem ich 2 lokale Ordner verwende, einen Brenn- und Datenordner.

Ich habe 2 Funktionen programmiert, DeleteBurnFolder sowie CopyFiles. DeleteBurnFolder hat einzig die Aufgabe den Inhalt des Brennordners zu löschen und CopyFiles kopiert dann die Daten aus dem Datenordner in den Brennordner, so sehen die beiden Funktionen aus:

Delphi-Quellcode:
// löscht Inhalt des Brennordners
function TfBurnstate.DeleteBurnFolder(const AFile: String): Boolean;
var
  ShellInfo: SHFileOpStruct;
begin
  Screen.Cursor := crHourglass;
  btnCancel.Enabled := False;

  ZeroMemory(@ShellInfo, sizeof(ShellInfo));
  with ShellInfo do
    begin
    Wnd := Application.Handle;
    wFunc := fo_Delete;
    pFrom := PChar(AFile+'\*.*'+#0);
    fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
    end;

  Result := ShFileOperation(ShellInfo)=0;

  Screen.Cursor := crDefault;
  btnCancel.Enabled := True;
  ZeroMemory(@ShellInfo, sizeof(ShellInfo));
end;


// Funktion zum Kopieren des Inhalts des Datenordners in den Brennordner
function TfBurnstate.CopyFiles(Burnfolder, Datafolder:String):Boolean;
var ShellInfo: TSHFileOpStructA;
begin
  Screen.Cursor := crHourglass;
  btnCancel.Enabled := False;

  ZeroMemory(@ShellInfo, sizeof(ShellInfo));
  with ShellInfo do
    begin
      wnd    := Application.Handle;
      wfunc  := FO_COPY;
      pFrom  := PChar(Datafolder+'\*.*'+#0);
      pTo    := PChar(Burnfolder+#0);
      fFlags := fof_Silent or fof_NoConfirmation;
    end;

  Result := SHFileOperation(ShellInfo) = 0;

  Screen.Cursor := crDefault;
  btnCancel.Enabled := True;
  ZeroMemory(@ShellInfo, sizeof(ShellInfo));
end;
Das kuriose ist: Es funktioniert, aber nicht so richtig :wall:....

Starte bzw. kompiliere ich die Anwendung zum ersten Mal, dann klappts wunderbar, der Brennordner wird gelöscht (ok verstehe ich auch ned ganz, denn ich will nur den Inhalt gelöscht haben) und die Kopierfunktion klappt auch wunderbar. Es wird der Inhalt des Datenordners 1:1 in den Brennordner kopiert :).

So nun kommts:
Ist das Programm den Ablauf durch und damit bereit "erneut" eine DVD zu brennen, wiederhole ich den Vorgang wie beim ersten Mal, NUR liefern mir nun beide "SHFileOperation" ein Zugriff verweigert :?:. Ok also scheint ne Freigabe zu fehlen, da ich NeroApi verwende und dort einen Isotree erstelle, dachte ich zunächst, dass dieser die Dateien blockiert, ist aber nicht so. Wenn ich nämlich mein Programmablauf vor dem Brennen stoppe und dann gleich wieder starte, tritt der Fehler ebenso auf.

Dann fällt mir noch was recht nerviges auf:
Das Kopieren scheint trotzdem stattzufinden, NUR wird nun nicht der Inhalt des Datenordners kopiert, sondern einfach der Ordner selbst samt Inhalt.

Das sieht dann so aus:

Erstes Mal kopieren:
Datenordner: "C:\daten\*.*"
Brennordner: "C:\brennen\*.*"

Zweites oder xtes Mal kopieren:
Datenordner: "C:\daten\*.*"
Brennordner: "C:\brennen\daten\*.*"

Also mich nervt das sehr, da es auch meine Arbeit grad beeinflusst und vor allem, weil es eine "Fremdfunktion" ist, ich aber auf sie angewiesen bin. Zwar könnte ich später theoretisch direkt aus dem Netzwerk die Daten zum Brennen holen, aber das wäre dann schon absolute Notlösung :wall: :wall:

Danke für eure Hilfe :corky:

EDIT:
Also ich habe weiter getestet und wenn die Anwendung das erste Mal läuft, klappts mehrfach problemlos, also hatte ich mich geirrt und die Sperrung erfolgt nach dem Brennvorgang mit der NeroAPI. Bei letzterer erstelle ich einen Root-Baum, der auf die Dateien verlinkt, also irgendwie logisch, dass die Dateien gelockt werden. NUR ich habe nun meine Formclose so erweitert, dass alles zur NeroAPI freigegeben wird (vorher im Formdestroy), u. a. auch die IsoTrack und IsoTreeItem Strukturen. Da mein "Brennfenster" sich nach jedem Vorgang schließt, wird dies auch ausgeführt!

Btw. die Sperrung scheint global zu sein, denn ausm Explorer kann ich auch nichts machen :(.

Go2EITS 14. Sep 2006 15:38

Re: Arbeiten mit "ShFileOperation" --> ab 2ten
 
Deine Function copyfiles habe ich bei mir ausprobiert. Bestens!

C:\data
C:\brennen
als Parameter funktionieren tadellos: Die Dateien werden rüberkopiert. Der Wurm ist wohl in der Parameterübergabe.

Falls Du dies nicht lösen kannst, zwei Notlösungen:
Delphi-Quellcode:
pFrom  := PChar('C:\data\*.*'+#0);
pTo    := PChar('C:\brennen'+#0);
(Äh, PChar(Bla) wandelt automatisch in ein nullterminierten String. Weshalb '+#0'?)

oder
Delphi-Quellcode:
Delete(Brennen,4,8)
müsste das 'Brennen\' entfernen, so dass C:\brennen\daten zu c:\daten wird.

Funzt was?
[EDIT: Text verschönert und Fehler im Code beseitigt]
Und wohl selbst gelöst... :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:00 Uhr.

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