Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehlermeldung bei Verschieben von Dateien verhindern (https://www.delphipraxis.net/138560-fehlermeldung-bei-verschieben-von-dateien-verhindern.html)

fiddling 12. Aug 2009 15:11


Fehlermeldung bei Verschieben von Dateien verhindern
 
Hallo zusammen!

Also, ich will mal nicht lange um den heißen Brei rumreden und komme gleich zur Sache:
Bei mir läuft 24 Stunden am Tag ein Programm (total recorder), das nichts anderes macht als das mitzuschneiden, was über den Mikrofon-Eingang der Soundkarte reinkommt. Dabei wird jeweils nach einer Stunde abgeschnitten, das heißt der Mitschnitt eines Tages besteht letztlich aus 24 MP3-Dateien, die je eine Stunde lang sind.
Die Dateien werden alle im selben Ordner gespeichert, einer Art Zwischenablage. Von dort werden sie von einem per Cronjob stündlich gestarteten Delphi-Programm in andere Ordner einsortiert (das Programm liest aus dem Dateinamen das Datum aus und verschiebt die Datei dann entsprechend (ein File von heute würde etwa im "W_0/Mittwoch" landen (W_0 steht für die aktuelle Woche, W_1 wäre letzte Woche etc.)).
So, zum eigentlichen Problem: Wenn das Delphi-Programm zum verschieben gestartet wird, versucht es alle Dateien in besagtem Zwischenordner zu verschieben - inklusive der Datei, die gerade vom Mitschnittprogramm geschrieben wird. Gibt natürlich eine Fehlermeldung.

Meine Frage wäre jetzt: Wie kann ich das umgehen? Also entweder die Datei, die gerade geschrieben wird, gar nicht verschieben (habe ich versucht mittels einer if-Abfrage über die Dateigröße zu realisieren, ging nicht) oder eben keine Fehlermeldung ausspucken, sondern einfach weitermachen.

Der Quellcode sieht wie folgt aus:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,DateUtils,ShellAPI;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure AlleDateienImVerz(pfad:string; gefunden:TStrings; MitUnterVerz:Boolean);
//gibt liste aller dateien im verz zurück, wahlweise mit allen in allen unterverz.
var
sr:       TWin32FindData;
h:        THandle;
begin
if ansilastchar(pfad)<>'\' then pfad:=pfad+'\';
h:=FindFirstFile(PChar(pfad + '*.*'),sr);
if not (h=INVALID_HANDLE_VALUE) then
repeat
if DirectoryExists(pfad+sr.cFileName) then
begin
if not (sr.cFileName[0]='.') then if MitUnterVerz then AlleDateienImVerz(pfad+sr.cFileName,gefunden, True);
end
else
begin
gefunden.add(pfad+sr.cFileName);
end;
until Findnextfile(h,sr)=false;
windows.FindClose(h);
end;

procedure ParseDelimited(const sl : TStrings; const value : string; const delimiter : string) ;
var
   dx : integer;
   ns : string;
   txt : string;
   delta : integer;
begin
   delta := Length(delimiter) ;
   txt := value + delimiter;
   sl.BeginUpdate;
   sl.Clear;
   try
     while Length(txt) > 0 do
     begin
       dx := Pos(delimiter, txt) ;
       ns := Copy(txt,0,dx-1) ;
       sl.Add(ns) ;
       txt := Copy(txt,dx+delta,MaxInt) ;
     end;
   finally
     sl.EndUpdate;
   end;
end;

function RenameFileEx(const AOldName, ANewName: string;
   ARenameCheck: boolean = false): boolean;
var
  sh: TSHFileOpStruct;
begin
  sh.Wnd := Application.Handle;
  sh.wFunc := fo_Move;

  // String muss mit #0#0 Terminiert werden, um das Listenende zu setzen
  sh.pFrom := PChar(AOldName + #0);
  sh.pTo := PChar(ANewName + #0);
  sh.fFlags := fof_Silent or fof_MultiDestFiles;
  if ARenameCheck then
    sh.fFlags := sh.fFlags or fof_RenameOnCollision;
  Result:=ShFileOperation(sh)=0;
end;

Procedure Verschieben(datei:string; woche:string; wochentag:integer; name:string);
var tag,neuerpfad:string;
begin
//Namen des Wochentags ermitteln (für Dateipfad)
  if wochentag = 1
    then
      tag := 'Sonntag'

  else if wochentag = 2
    then
      tag := 'Montag'

  else if wochentag = 3
    then
      tag := 'Dienstag'

  else if wochentag = 4
    then
      tag := 'Mittwoch'

  else if wochentag = 5
    then
      tag := 'Donnerstag'

  else if wochentag = 6
    then
      tag := 'Freitag'

  else if wochentag = 7
    then
      tag := 'Samstag';

neuerpfad:='C:\Doku\ARCHIV\replay\'+woche+'\'+tag+'\'+name; //neuer Speicherort
RenameFileEx(datei,neuerpfad); //Datei verschieben

end;

// H I E R  G E H T  E S  R I C H T I G  L O S :

procedure TForm1.FormCreate(Sender: TObject);
var dateien,teile,datumselemente:TStringList;
i,currweek,dateweek,wochentag:integer;
pfad,dateiname,datum:string;
begin
Application.ShowMainForm:=false; //Kein "Fenster" anzeigen
sleep(5000); //Abwarten, damit letzte Datei sicher fertig geschrieben ist

dateien:=TStringlist.Create;
teile:=TStringlist.Create;
datumselemente:=TStringlist.Create;

pfad:='C:\Doku\totalrecorder';

AlleDateienImVerz(pfad, dateien, false); //Alle Dateien aus pfad in datein laden

for I := 0 to dateien.Count - 1 //Alle Dateien nacheinander durchschleifen
  do begin
    dateiname:=copy(dateien[i], length(pfad)+2, 100); //Dateiname aus pfad
    ParseDelimited(teile,dateiname,'_'); //Dateinamen aufspalten und in teile laden
    ParseDelimited(datumselemente,teile[0],'-'); //Datum aufspalten und in datumselemente laden
    datum:=datumselemente[2]+'.'+datumselemente[1]+'.'+datumselemente[0]; //Datum wieder zusammensetzen (als DD.MM.YYYY)
    currweek:=WeekOfTheYear(now); //Aktuelle Kalenderwoche
    dateweek:=WeekOfTheYear(strtodate(datum)); //Kalenderwoche, aus der die Datei stammt
    wochentag:=DayOfWeek(strtodate(datum)); //Wochentag, von dem die Datei stammt

    //Datei entsprechend ihrer Woche und ihres Wochentags verschieben:
    if currweek-dateweek = 0
      then begin
        Verschieben(dateien[i], 'W_0', wochentag, dateiname)
      end

    else if currweek-dateweek = 1
      then begin
        Verschieben(dateien[i], 'W_1', wochentag, dateiname)
      end

    else if currweek-dateweek = 2
      then begin
        Verschieben(dateien[i], 'W_2', wochentag, dateiname)
      end

    else if currweek-dateweek = 3
      then begin
        Verschieben(dateien[i], 'W_3', wochentag, dateiname)
      end

    else if currweek-dateweek = 4
      then begin
        Verschieben(dateien[i], 'W_4', wochentag, dateiname)
      end

    else if currweek-dateweek = 5
      then begin
        Verschieben(dateien[i], 'W_5', wochentag, dateiname)
      end

    else if currweek-dateweek = 6
      then begin
        Verschieben(dateien[i], 'W_6', wochentag, dateiname)
      end
  end;

dateien.free;
teile.Free;
datumselemente.free;
Application.Terminate;
end;

end.
Tut mir sehr leid, wenn das Problem etwas verwirrend beschrieben ist, aber es ist echt nicht ganz einfach zu erklären, da ihr nicht wisst, womit das Ganze zusammenhängt :wink:

Ich hoffe, dass mir hier trotzdem jemand helfen kann. Danke dafür schon mal im Voraus!

Gruß
fiddling

//Edit: Sieht so aus als sei das Problem gelöst.

mashutu 13. Aug 2009 08:24

Re: Fehlermeldung bei Verschieben von Dateien verhindern
 
{$i-}
dateiverschieben(...);
{$i+}
if ioresult <> 0 then
///irgendwas hat nicht geklappt

khh 13. Aug 2009 08:35

Re: Fehlermeldung bei Verschieben von Dateien verhindern
 
kannst du nicht einfach ein datei-flag beim Fertigstellen der files setzen und nur dies dateien mit gesetztem Flag verschieben ?

fiddling 13. Aug 2009 10:49

Re: Fehlermeldung bei Verschieben von Dateien verhindern
 
Der Fehler saß klassischerweise mal wieder vor dem Bildschirm :wall:
Mein Cronjob hat die ganze Zeit eine veraltete Kopie des entsprechenden Programms aufgerufen, so dass meine ganzen Änderungsversuche überhaupt keinen Einfluss hatten.
Naja, das ganze läuft jetzt über secondsbetween(). Das heißt ich prüfe, ob zwischen dem Zeitpunkt im Dateinamen (der gibt an, wann das Schreiben der Datei begonnen wurde) und jetzt mindestens 3600 Sekunden liegen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 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