Seite 1 von 1

FILECOPY(=

Verfasst: Do, 07. Aug 2014 14:33
von sherlogg
Hallo Zusammen!

Ich muss in einem älteren Programm Anpassungen machen, die es erforderlich machen, eine ganze Reihe von .DBF's und .DBT's wegzukopieren. Jetzt habe ich ein sehr witziges Problem mit dem FILECOPY() der Tools (beim Befehl COPY FILE ist es erstaunlicherweise das gleiche Verhalten).

Ich sammle die DBF's und DBT's in einem Array und arbeite das in einer Schleife ab ...

Code: Alles auswählen

FOR nI := 01 TO LEN(Array)
       FILECOPY(cAlterPfad+Array[nI],cNeuerPfad+Array[nI])    // Backup-Modus spielt keine Rolle
NEXT
Das Array ist mit 77 Einträgen sehr überschaubar. Jetzt habe ich das Phänomen, dass er mittendrin 5 oder 6 Dateien (eine ist an Position 56 und die letzten sind fast am Ende oder am Ende des Array's) nicht kopiert. Im Zielverzeichnis gibt es diese Dateien noch nicht (das kann also nicht das Problem sein). Alle anderen werden problemlos kopiert.

Und jetzt kommts:

Wenn ich in einem kleinen Testprogramm FILECOPY() mit "Direkteinträgen" nutze

Code: Alles auswählen

FILECOPY("C:\FAKT\DATEI.DBF"  ,  "D:\PROJEKTE\CLIPPER\BACKUP\20140807\DATEI.DBF")
funktioniert es.

Wie schon gesagt, als Variablen funktioniert der FILECOPY() bei den wenigen Dateien nicht.

Ich achte darauf

- das keine Leerzeichen in den Variablen enthalten sind
- das die Einstellungen CSETSAFETY() und SETFCREATE() richtig gesetzt sind
- zur Sicherheit benutze ich nach jeden Kopiervorgang FILECCLOSE()
- das die Verzeichnistiefe nicht überschritten wird
- die Dateinamen nicht zu lang sind

Es sind immer die gleichen DBF's, die er NICHT kopiert, aber wie gesagt, wenn ich alles in Anführungszeichen im Testprogramm nutze, dann tut es. Ich habe schon die Struktur einer dieser DBF in eine andere Datei kopiert, einen APPEND von der anderen DBF gemacht. Das Original gelöscht und den Clone umbenannt. Gleiches Phänomen.

Ich habe eigentlich keine Lust mit der APPEND FROM oder COPY TO Freckelei anzufangen, da der FILECOPY() ja eigentlich superschnell arbeitet.

Hat einer von Euch schon einmal das gleiche Phänomen gehabt? Ist das jetzt ein UFO-Phänomen?

Mein Problem ist halt, dass ich mich jetzt fest gebissen habe :razz: und eigentlich nicht aufgeben will!

Re: FILECOPY(=

Verfasst: Do, 07. Aug 2014 14:50
von Tom
Ich würde mal etwas Debugcode einfügen und die Parameter jedes Kopiervorgangs anzeigen lassen, ggf. ergänzt um eine File()-Abfrage auf die Zieldatei und deren Ergebnis. Ich bin sicher, dass es irgendwo ein Dateinamenproblem geben muss, wenn der Fehler immer an der gleichen Stelle auftritt. Denkbar wären aber auch Rechte oder hineinfunkende Virenscanner, was ich aber für unwahrscheinlich halte. Ergänzend könnte man ProcMon() (www.sysinternals.com) mitlaufen lassen, um zu sehen, welche Operation auf Betriebssystemebene ausgelöst wird und welche Probleme es ggf. dabei gibt.

Re: FILECOPY(=

Verfasst: Do, 07. Aug 2014 15:44
von Wolfgang Ciriack
Notfalls auch mal eine kleine Schleife einbauen und sehen ob es was bringt (ungetestet):

Code: Alles auswählen

c:=0
do while (n:=filecopy(datei1, datei2))<>filesize(datei2) .and. c<10
    sleep(10)
    c++
enddo
if c>0 
   ** Meldung ausgeben, mehr als 1x probiert
endif

Re: FILECOPY(=

Verfasst: Do, 07. Aug 2014 15:46
von komnick
Entschuldige die triviale Frage, aber...
kann es sein, dass im Zielverzeichnis einfach nicht genug Platz ist?
Gruß, Martin

Re: FILECOPY(=

Verfasst: Do, 07. Aug 2014 15:58
von brandelh
NATÜRLICH :!:

aber das sollte heute auf Festplatten nicht mehr vorkommen ;-)
Versuche doch mal die Dateien mit XCOPY /V zu kopieren, dort sollte es eine Fehlermeldung geben, wenn das Betriebssystem nicht kann.
Eventuell sind die Dateien auch nicht von jedem Programm geschlossen, es ist nicht selbstverständlich, dass man offene Dateien kopieren kann ;-)

Re: FILECOPY()

Verfasst: Do, 07. Aug 2014 16:18
von sherlogg
Hallo Zusammen,

zunächst mal Danke für die Antworten.

Die triviale Frage nach dem Platz sei gestattet. An solche Dinge denkt man meist zuletzt. Aber daran habe ich schon gedacht und wie ja gesagt wurde, in der heutigen Zeit ...

Debug Infos sind drin. Keine Erkenntnisse. Eine Schleife habe ich noch nicht eingebaut. Werde ich gleich mal tun. XCOPY /V werde ich auch gleich testen.

Interessant ist:

Ich habe eine der Problem-Dateien (heißt: LPROGAUF.DBF -> lokale Programmaufrufe) mal gelöscht und habe eine DBF mit dem Namen NPROGAUF.DBF (identische Struktur, nur anderes VZ) auf LPROGAUF.DBF kopiert. NPROGAUF.DBF wird von FILECOPY() sauber kopiert. Nach dem Umkopieren wird LPROGAUF.DBF von FILECOPY() trotzdem nicht kopiert. Das ist wirklich schräg.

P.S. das alles läuft noch auf dem Entwicklungsrechner/Testumgebung. Also ausreichend HDD und MEM ;-)

Re: FILECOPY(=

Verfasst: Do, 07. Aug 2014 17:01
von sherlogg
Hallo Zusammen!

Das hat alles nichts gebracht. XCOPY /V kopiert einwandfrei. Die Schleife hat nur die Erkenntnis gebracht, dass er auf die Abfrage c > 0 läuft - also erfolglos versucht zu kopieren.

Da ich mit verschiedenen Pfadangaben arbeite, habe ich das "faule Ei" mal in das Programmverzeichnis kopiert. Von dort aus wird sie einwandfrei kopiert.

Ich denke, es ist an der Zeit kein Zeit mehr zu verschwenden und einen anderen Weg zu suchen.

Nochmals Danke an Euch!

Gruß, Dieter

Re: FILECOPY(=

Verfasst: Do, 07. Aug 2014 17:42
von brandelh
ich habe immer XCOPY über eine batch genutzt, das hat den Vorteil, dass das Betriebssystem dafür verantwortlich ist ;-)

Re: FILECOPY(=

Verfasst: Do, 07. Aug 2014 18:20
von Martin Altmann
Moin,
wie heißen denn die Quell und Zielpfad bei den nicht kopierten Dateien?
Sind die Pfade identisch zu den Dateien, die erfolgreich kopiert wurden?

Viele Grüße,
Martin

Re: FILECOPY()

Verfasst: Do, 07. Aug 2014 19:18
von sherlogg
Hallo Martin,

der Zielpfad ist durchgehend der Gleiche ...

Bsp.: D:\PROJEKTE\CLIPPER\FAKTAKT\BACKUP\20140807

Die Quellen können unterschiedlich sein (maximal 2 verschiedene Pfade).

Gruß, Dieter

Re: FILECOPY(=

Verfasst: Do, 07. Aug 2014 19:19
von sherlogg
Und ja, die Zielpfade sind identisch ... erfolgreich kopiert und nicht erfolgreich kopiert

Re: FILECOPY(=

Verfasst: Do, 07. Aug 2014 22:46
von Werner_Bayern
mal testen mit

Code: Alles auswählen

copy file (cQuelle) to (cZiel)
Damit sollte es gehen. Hatte mal ein ähnliches Problem unter XP mit fwrite (Nachstellung des xcopy-Befehls in Xbase++). Mit o. g. Befehl ging es, leider dann ohne jeglichen Komfort: Kein Rückgabeparameter, keine Möglichkeit eines Fortschrittsbalken etc.

Gibts den unter clipper?

Re: FILECOPY(=

Verfasst: Fr, 08. Aug 2014 2:02
von AUGE_OHR
hi,

da Werner gerade "Fortschrittsbalken" angesprochen hast : dafür gibt es ShFile ( benötigt ot4xb )
es ist die API vom Explorer, wenn man damit Dateien kopiert/löscht/move, und zeigt einem auch die entsprechende Animation mit dem Progressbar.

http://www.xbaseforum.de/viewtopic.php? ... ile#p56170
http://www.xbaseforum.de/viewtopic.php? ... ile#p70547
http://www.xbaseforum.de/viewtopic.php? ... ile#p79632

p.s. wenn es sich um ein Backup handelt könnte man es auch, mit Bordmittel, "ZIP"pen
siehe "Copyhere" API http://www.xbaseforum.de/viewtopic.php? ... lit=shfile

Re: FILECOPY(=

Verfasst: Fr, 08. Aug 2014 8:55
von komnick
Hallo Dieter,

ersetze dein FILECOPY() doch mal durch eine selbstgebastelte Kopierfunktion, die dir eine konkretere Fehlermeldung liefert, z.B. diese:

Code: Alles auswählen

#include "fileio.ch"

FUNCTION mycopy(quelle, ziel)

#xtranslate BLOCKGROESSE => 60000

LOCAL handleq
LOCAL handlez
LOCAL cBuffer := ""
LOCAL iSize

IF !FILE(quelle)
   ALERT(quelle+" existiert nicht.")
   RETURN .F.
ENDIF

handleq := FOPEN(quelle, FO_READ)
IF handleq < 0
   ALERT("FOPEN("+quelle+") scheitert.")
   RETURN .F.
ENDIF

handlez := FCREATE(ziel, FC_NORMAL)
IF handlez < 0
   ALERT("FCREATE("+ziel+") scheitert.")
   FCLOSE(handleq)
   RETURN .F.
ENDIF

cBuffer := SPACE(BLOCKGROESSE)
DO WHILE .T.
   iSize := FREAD(handleq, @cBuffer, BLOCKGROESSE)
   
   IF EMPTY(iSize) 
      EXIT
   ENDIF
         
   IF FWRITE(handlez, cBuffer, iSize) # iSize
      ALERT("FWRITE("+ziel+") scheitert. ("+str(FERROR(),2)+")")
      FCLOSE(handleq)
      FCLOSE(handlez)
      RETURN .F.
   ENDIF
   
   IF iSize # BLOCKGROESSE
      EXIT
   ENDIF
ENDDO
      
FCLOSE(handleq)
FCLOSE(handlez)
RETURN .T.

* -EOP- mycopy
Ferner würde mich interessieren, ob dieselben Files nicht kopiert werden, wenn du das Zielverzeichnis leerst und die Dateien in anderer - z.B. genau umgekehrter - Reihenfolge kopierst.

Gruß
Martin

Re: FILECOPY(=

Verfasst: Fr, 08. Aug 2014 9:40
von brandelh
Bitte beachten, wir sind hier im CLIPPER Forum, daher vermute ich er verwendet CLIPPER als compiler :!:

Re: FILECOPY(=

Verfasst: Fr, 08. Aug 2014 18:06
von sherlogg
Ja, hier geht es noch um Clipper.

Hallo Martin, werde ich mal testen (sowohl selbst gebastelte Routine als auch die Reihenfolge umkehren). Danke!

Gruß, Dieter

Re: FILECOPY(=

Verfasst: Fr, 08. Aug 2014 19:47
von AUGE_OHR
sherlogg hat geschrieben:Ja, hier geht es noch um Clipper.
aber du hast doch auch Xbase++, oder ?
man kann ja auch eine Xbase++ Applikation aus Cl*pper per RUN Befehl ausführen ...

Re: FILECOPY(=

Verfasst: Fr, 08. Aug 2014 22:07
von sherlogg
Hallo Jimmy,

ja, ich habe auch xBase++.

Werde ich mir mal einen Kopf machen.

Danke!

Gruß, Dieter

Re: FILECOPY(=

Verfasst: Sa, 09. Aug 2014 12:45
von Werner_Bayern
Werner_Bayern hat geschrieben:mal testen mit

Code: Alles auswählen

copy file (cQuelle) to (cZiel)
?
Hats funktioniert? Hab gerade nachgesehen, den gibt's unter Clipper.