Autor Beitrag
tortom1000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 175

Win XP, Win Server 2003 - 2012, Win 7
Delphi 7
BeitragVerfasst: Do 04.08.05 13:24 
Hi, nochmal ne Frage: Ich überprüfen einen Ordner auf Erscheinen. Wenn er auftaucht, soll er umbenannt werden (RenameDir('c:\ordnername','C:\ordnername-neu'); Wenn ich jetzt den Ordner vie Netzwerk nach c: kopiere, versucht das Programm diesen schon umzubenennen, auch wenn noch nicht alle Dateien des Ordners kopiert sind. Wie kann ich denn diesen Fehler abfangen. Der Ordner soll ja erst dann umbenannt werden, wenn dieses auch möglich ist.
Gruß Tom


Moderiert von user profile iconraziel: Topic aus Multimedia / Spiele / Grafik verschoben am Do 04.08.2005 um 16:43
da_cara
Hält's aus hier
Beiträge: 12

Win XP SP2
D7 Ent
BeitragVerfasst: Do 04.08.05 13:44 
Verschiebt das Programm den Ortner und ändert den namen oder Ändert nur den Namen? Versteh das net ganz. Wenn ersteres der fall sein sollte, Erstell einfach noch eine Procedure.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
var
  Finished: Boolean;

procedure RenameFolder;
begin
  if Finished = true
    then RenameDir('c:\ordnername','C:\ordnername-neu');
end;

Erstell dir einfach eine Var mit die du dann änderst wenn alle Daten verschoben sind und rufe dann die Procedure RenameDir auf.
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Do 04.08.05 13:45 
das ist soweit ich weiß nicht so einfach, weil du keine systembotschaft erhältst, wann das schreiben fertig ist. ein workaround wäre folgendes:

sobald der ordner erzeugt wird, prüfst du, ob du schreibzugriff hast. wenn nicht, startest du einen thread, der in einem gewissen zeitintervall prüft, ob du schreibzugriff hast (polling genannt). sobald du schreibzugriff hast, benennst du ihn um.


gruß
Nicolai

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Do 04.08.05 13:46 
user profile iconda_cara hat folgendes geschrieben:
Verschiebt das Programm den Ortner und ändert den namen oder Ändert nur den Namen?


Hi,
ich glaube tortom1000 prüft generell, ob der ordner angelegt wird/wurde (egal, welches programm), dann geht deine Idee leider nicht mehr.

gruß
Nicolai

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
tortom1000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 175

Win XP, Win Server 2003 - 2012, Win 7
Delphi 7
BeitragVerfasst: Do 04.08.05 17:15 
Hallo, irgendwie scheint mein Problem doch schwieriger zu sein als erwartet.
Auf einem Rechner läuft das gewünschte Programm. Dieses soll einen Ordner überwachen.
Taucht in dem Ordner ein Unterordner auf (wird von einem Rechner aus dem Netzwerk in den zu überwachenden Ordner kopiert), soll dieser Ordner automatisch umbenannt werden.
Damit sind zwei Probleme verbunden:
1. ich weiß nicht, wie der Unterordner heißt - Wie kann man diesen dann umbenennen ohne zu wissen, wie er heißt???
2. Wenn der Unterordner relativ groß ist, wie kann ich sicherstellen, das er erst umbenannt wird, wenn alle Dateien kopiert sind. Vorher gibst doch sonst einen Fehler, da der Ordner ja noch fürs umbenennen gesperrt ist und das gewünschte Programm raucht ab.
Tom
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Do 04.08.05 20:19 
Hi!
Also da kommt meine Lösung deinem Problem doch schon relativ nahe, nur hatte ich gedacht, dass du weißt, wie der neue Ordner heißt.

Wie du ran kommst, wenn ein neuer Ordner erzeugt wurde: Du kannst entweder von der "Beispiele"/"Samples" Seite deiner Delphi Ausgabe (zumindest ab Delphi 6) die Komponenten "ShellChangeNotifier" (oder so ähnlich) nutzen, damit bekommst du schon mal mit, wenn sich in dem Ordner was tut und dann mit FindFirstChangeNotification nach dem Ordner suchen. Ob und wie das genau geht, kann ich dir nicht sagen. Sollte es damit nicht gehen, dann mach dich mal ein wenig über ICopyHook vom WinAPI schlau, eventuell kannst du damit was erreichen (ohne größere Umstände).

Sobald du also mitgekriegt hast, dass der Ordner erzeugt wird, kannst du den Thread starten, den ich dir gesagt hatte: Der prüft, ob du den Ordner umbenennen kannst (per Abfrage auf den Ordner, ob ein anderer Prozess gerade noch darauf zugreift oder unschöner, einfach nen try-except basteln). Sobald dein Thread merkt, dass du ihn umbenennen kannst, machst du das und terminierst den Thread.

Gruß
Nicolai

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
da_cara
Hält's aus hier
Beiträge: 12

Win XP SP2
D7 Ent
BeitragVerfasst: Do 04.08.05 22:02 
user profile icontortom1000 hat folgendes geschrieben:
1. ich weiß nicht, wie der Unterordner heißt - Wie kann man diesen dann umbenennen ohne zu wissen, wie er heißt???

Ich habe da eine Variante, die sicher nicht die leichteste ist, aber eine die Funktioniert.

ausblenden volle Höhe 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:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
var
  Directory: String;  // Zu ändernder Ordnername
  OldDirList: TStringList;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OldDirList := TStringList.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  SearchRec: TSearchRec;
  Dir: String; // Zu überwachender Ordner
  NewDirList: TStringList;
  I: Integer;
  I2: Integer;
begin
  OldDirList.Add('a');
  OldDirList.Add('b');
  OldDirList.Add('d');
  OldDirList.Add('e');
  NewDirList := TStringList.Create;
  Dir := 'C:\testverzeichnis\';
  if FindFirst(dir+'*', faDirectory, SearchRec) = 0
    then
      begin
        repeat
          if (SearchRec.Name <> '.') and (SearchRec.Name <> '..')
            then NewDirList.Add(SearchRec.Name);
        until
          FindNext(SearchRec) <> 0;
        end;
  if NewDirList.Count < 1 then exit;
  if NewDirList.Count = 1
    then
      begin
        Directory := Dir+NewDirList.Strings[0];
        exit;
      end;
  for I := 0 to NewDirList.Count-1 do begin
    for I2 := 0 to OldDirList.Count-1 do begin
      if OldDirList.Strings[I2] = NewDirList.Strings[I]
        then
          break
        else
          if (I2 = OldDirList.Count-1) and (NewDirList.Strings[I] <> OldDirList.Strings[I2])
            then
              begin
                Directory := Dir+NewDirList.Strings[I];
                exit;
             end;
    end;
  end;
  NewDirList.Free;
  OldDirList.Free;
end;


Nehmen wir an, du hast ein Verzeichnis namens "C:\testverzeichnis" mit den Unterverzeichnissen "\a" "\b" "\c" "\d" "\e". Wobei das Unterverzeichnis "\c" gerade erst entstanden ist. Diese Proc ckeckt die momentanen Ordner und vergleicht sie mit den bereits geänderten Ordnern. In diesem fall würde Ordner "\c" überbleiben. Der würde dann in Directory als "C:\testverzeichnis\c" angegeben werden. Die Proc noch an nen Timer angehängt und das erste Problem sollte behoben sein. Du Darfst nur net vergessen nach dem ändern des Ordner namen's den Pfad in die OldDirList zu adden.
tortom1000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 175

Win XP, Win Server 2003 - 2012, Win 7
Delphi 7
BeitragVerfasst: Fr 05.08.05 13:01 
Hallo, nochmal 'ne Frage...
Das Proggi merkt jetzt, wenn in dem zu überwachenden Ordner ein neuer Unterordner auftaucht, der aus dem Netzwerk heraus angelegt wurde. Da in diesen Unterordner aus
dem Netzwerk Daten hereinkopiert werden, darf ich diesen ja erst umbenennen, wenn die "Kopiererei" fertig ist, andernfalls entziehe ich ja der kopierenden Anwendung den Zielordner und ich habe nicht alle Dateien in "meinem" neuen Ordner.
Woher weiß ich denn, wann Windows das Kopieren der Dateien abgeschlossen hat?
Schreibzugriff habe ich doch auf den Ordner, sobald dieser angelegt wurde. Umbenennen kann ich ihn auch. D.h. mit einer Fehlerabfrage in der Form try.... finally.... usw.
klappts wohl nicht. Ich müßte irgendwie Windows befragen, aber wie?????
Viele Grüße Tom
rochus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: Fr 05.08.05 13:24 

_________________
Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean