AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Fehlermeldung bei Verschieben von Dateien verhindern
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung bei Verschieben von Dateien verhindern

Ein Thema von fiddling · begonnen am 12. Aug 2009 · letzter Beitrag vom 13. Aug 2009
Antwort Antwort
fiddling

Registriert seit: 12. Aug 2009
2 Beiträge
 
#1

Fehlermeldung bei Verschieben von Dateien verhindern

  Alt 12. Aug 2009, 16:11
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

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.
  Mit Zitat antworten Zitat
mashutu

Registriert seit: 15. Nov 2007
195 Beiträge
 
#2

Re: Fehlermeldung bei Verschieben von Dateien verhindern

  Alt 13. Aug 2009, 09:24
{$i-}
dateiverschieben(...);
{$i+}
if ioresult <> 0 then
///irgendwas hat nicht geklappt
utu

if it was hard to write it should be hard to read
  Mit Zitat antworten Zitat
khh

Registriert seit: 18. Apr 2008
Ort: Südbaden
1.929 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Fehlermeldung bei Verschieben von Dateien verhindern

  Alt 13. Aug 2009, 09:35
kannst du nicht einfach ein datei-flag beim Fertigstellen der files setzen und nur dies dateien mit gesetztem Flag verschieben ?
Karl-Heinz
  Mit Zitat antworten Zitat
fiddling

Registriert seit: 12. Aug 2009
2 Beiträge
 
#4

Re: Fehlermeldung bei Verschieben von Dateien verhindern

  Alt 13. Aug 2009, 11:49
Der Fehler saß klassischerweise mal wieder vor dem Bildschirm
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:17 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