Entwickler-Ecke

Dateizugriff - Problem mit Verzeichnisauswahl (oder fremde Mächte)


Muffi - Do 09.10.03 15:56
Titel: Problem mit Verzeichnisauswahl (oder fremde Mächte)
:wink: Einmal noch heute, dann is auch gut

Nutze in meinem selbsterstellten Tool eine Funktion mir der man ein Dialogfeld einblendet und dort ein Verzeichnis auswählen kann (SelectDirectory usw.). Jetzt dachte ich das Programm wäre fertig, da fängt es bei der Feinoptimierung erst so richtig an. :roll:

Das Programm kopiert Text-Dateien von J:\Schwipp nach J:\Schwupp (Pfade vorher per obiger Funktion ausgewählt und heißen wirklich so). Es läuft perfekt. Es läuft automatisch. Kann nicht besser sein. Endlich kein rumkopiere mehr.
Aber jetzt:
J: ist ein großes Verzeichnis mit ca 40 Unterverzeichnissen. Naja und um nicht immer beim Verzeichnis auswählen an der Laufleiste zu schrauben habe ich die Verzeichnisse im Windows-Explorer per F2 in J:\aSchwipp und J:\aSchwupp umbenannt. Damit sie oben stehen. 8)

Wenn ich das Programm jetzt starte kommt die folgenden Fehlermeldung
bei jedem Verschiebeversuch (die Ordner habe ich natürlich neu ausgewählt):

Die Datei kann nicht verschoben werden: Die Quelldatei oder vom Quelldatenträger kann nicht gelesen werden

Hääähhh :shock: :shock: :shock:

Wenn ich das Verzeichnis wieder umbenenne, läuft alles wieder super. 8)

Ich bin ratlos :cry:


barfuesser - Do 09.10.03 16:41

Hast Du vielleicht die Verzeichnisnamen mal zu Testzwechen hard gecodet und diese Stellen nicht wieder korrigiert?

barfuesser


Tana´Ri - Do 09.10.03 16:47

hast du die namen der verzeichnisse irgendwo fest im dem code implementiert (const) sodas er sich jetzt nicht mehr findet ?
Zitat:

Wenn ich das Verzeichnis wieder umbenenne, läuft alles wieder super.

hört sich nämlich so an :)


Muffi - Fr 10.10.03 13:22

:? :? :?

Also ich habe mir den Quelltext jetzt bestimmt schon 8-mal angeschaut um zu sehen woran es liegen könnte. Ich find nix. Ist auch nirgends im Quelltext als Konstante oder so angegeben.

Das einzige was es sein könnte (ratlos)
wäre die Zuweisung bei SHFileOperation.

Man weist ja dabei per z.B. F.pFrom das Quellverzeichnis zu.
Da diese meines Wissens vom Typ PChar ist habe ich das Verzeichnis so zugewiesen. Wobei Verzeichnisvariable ein String ist

F.pFrom:=pchar(Verzeichnisvariable)


Andi1982 - Fr 10.10.03 14:04

Versuch mal aus J:\aSchwipp und J:\aSchwupp ein
J:\ASchwipp und J:\ASchwupp zu machen! Vielleicht bringt das ja was

Gruss Andi


Muffi - Sa 11.10.03 00:41

Das hat auch nix gebracht. :bawling:

Hier mal der auf das wesentliche gekürzte Sourcecode:

QFolder = QuellFolder
DFolder = DestinationFolder

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
x:=0;
dir:=QFolder+'\*.txt';
Attr:=faAnyFile;

if findFirst(dir,Attr,SR)=0 then
  begin
    if (SR.Attr and Attr) = SR.Attr then
      begin
        X:=X+1;
        DSatz(.X.):=SR.Name;
      end;
    while FindNext(SR)=0 do
      begin
        if (SR.Attr and Attr) = SR.Attr then
          begin
            X:=X+1;
            DSatz(.X.):=SR.Name;
          end;
      end;
    FindClose(SR);
  end;
     F.Wnd:=Handle;
     F.wFunc:=FO_Move;
     QF:=QFolder+'\*.txt';
     pQFolder:=pChar(QF);
     F.pFrom:=pQfolder;
     DF:=DFolder+'\';
     pDFolder:=pChar(DF);
     F.pTo:=pDFolder;
     F.fFlags:=FOF_RenameOnCollision or FOF_NoConfirmation;
     if SHFileOperation(F)<>0 then ShowMessage('Copy Failed');
  end;

Hundert Augen sehen mehr als zwei :)

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Tana´Ri - Mo 13.10.03 08:46


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
x:=0
dir:=QFolder+'\*.txt'
Attr:=faAnyFile; 

if findFirst(dir,Attr,SR)=0 then 
 try
  repeat
   if (SR.Attr and Attr) = SR.Attr then
    begin 
        X:=X+1
        DSatz(.X.):=SR.Name; 
    end;
  until FindNext(SR) <> 0
 finally
   FindClose(SR); 
 end
 
     F.Wnd:=Handle; 
     F.wFunc:=FO_Move;
 
     QF:=QFolder+'\*.txt'
     pQFolder:=pChar(QF)+#0
     F.pFrom:=pQfolder; 
     DF:=DFolder+'\'
     pDFolder:=pChar(DF)+#0
     F.pTo:=pDFolder; 

     F.fFlags:=FOF_RenameOnCollision or FOF_NoConfirmation; 
     if SHFileOperation(F)<>0 then ShowMessage('Copy Failed'); 

  end;


zur erläuterung: du kannst be SHFileOperation_struct bei pTo & pFrom mehrere (nicht relative) Pfade angeben (zu Files oder Directories), pFrom kann mit * kombiniert werden. um aber der verarbeitenden funktion das ende deine Pfadangaben zu signalisieren muss eine doppelte NUll-terminierung erfolen. ein PChar also ein NUll-terminierter String muss einfach noch ne Null (#0) terminierung angehängt werden.
Wahrscheinlich wars das ;)


Muffi - Mo 13.10.03 12:17

Ne Ne Ne, funktioniert alles nicht. :autsch:

Ich hab jetzt den Quellcode erst mal extra gesichert und werde es später noch mal versuchen (mir raucht der Kopf).

Sollte jemand noch ne Idee haben kann er natürlich noch mal posten.

Werde es jetzt mal mit Copy/Move/Rename/Delete.. -File versuchen ob der gleiche Fehler auftaucht. :roll: :roll:

Werde euch dann ggf. berichten, wenn ich des Rätsels Lösung weiß.


Muffi - Do 16.10.03 09:53

Was lange währt .....

Juchuuuu es klappelt :dance:

Wollte mich doch noch nicht so schnell geschlagen geben. Hab´s noch mal probiert und es funktioniert (endlich).

Tana´Ri hatte recht (Danke noch mal). Es lag (auch) an der doppelten Nullung (#0). :angel:

Zusätzlich hatte ich aber auch eine Schleife um das ganze Konstrukt gebaut, die aber falsch angelegt war und immer den letzten Eintrag nicht erfasste. :eyecrazy:

Also Repeat...until in while...do umfunktioniert, Schleifeneingangsbedingung geändert und einer Flasche Bier als Belohnung stand nix mehr im Wege... :mrgreen: :mrgreen:

:!: Kleiner Tip:

Als ich das Programm dann in mehreren Varianten getestet habe mit verschiedenen Dateien, in verschiedenen Ordnern usw. wurden plötzlich Dateien kopiert, die ich zwar kannte aber überhaupt nicht im Explorer auftauchten.
Und auch Funktionen die die Dateienanzahl eines Verzeichnisses anzeigen sollten bzw deren Speicherkapazität schienen scheinbar nicht zu funktionieren. Bis der erlösende Geistesblitz kam. Mit FindFirst, FindNext werden auch versteckte Dateien erfaßt. Also kleine Abfrage eingesetzt und Problem gelöst.


Tana´Ri - Do 16.10.03 10:23

soviel viel ich weiss werden die mit findfirst ... gefundenen dateien auch in ihrer physikalischen Ordnung gefunden -> d.h. nicht alphabetisch oder dergleichen sonder in der Speicherrangfolge (wenn mans mal so nennen darf) ;)