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
....
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
Danke für eure Hilfe
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
.