FILECOPY(=

Still in use?

Moderator: Moderatoren

Antworten
Benutzeravatar
sherlogg
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Mo, 19. Nov 2012 14:59
Wohnort: Mühlheim am Main
Hat sich bedankt: 15 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

FILECOPY(=

Beitrag 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!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: FILECOPY(=

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: FILECOPY(=

Beitrag 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
Viele Grüße
Wolfgang
Benutzeravatar
komnick
UDF-Programmierer
UDF-Programmierer
Beiträge: 75
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin
Hat sich bedankt: 1 Mal
Danksagung erhalten: 5 Mal

Re: FILECOPY(=

Beitrag von komnick »

Entschuldige die triviale Frage, aber...
kann es sein, dass im Zielverzeichnis einfach nicht genug Platz ist?
Gruß, Martin
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: FILECOPY(=

Beitrag 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 ;-)
Gruß
Hubert
Benutzeravatar
sherlogg
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Mo, 19. Nov 2012 14:59
Wohnort: Mühlheim am Main
Hat sich bedankt: 15 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: FILECOPY()

Beitrag 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 ;-)
Benutzeravatar
sherlogg
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Mo, 19. Nov 2012 14:59
Wohnort: Mühlheim am Main
Hat sich bedankt: 15 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: FILECOPY(=

Beitrag 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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: FILECOPY(=

Beitrag von brandelh »

ich habe immer XCOPY über eine batch genutzt, das hat den Vorteil, dass das Betriebssystem dafür verantwortlich ist ;-)
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16501
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: FILECOPY(=

Beitrag 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
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
sherlogg
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Mo, 19. Nov 2012 14:59
Wohnort: Mühlheim am Main
Hat sich bedankt: 15 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: FILECOPY()

Beitrag 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
Benutzeravatar
sherlogg
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Mo, 19. Nov 2012 14:59
Wohnort: Mühlheim am Main
Hat sich bedankt: 15 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: FILECOPY(=

Beitrag von sherlogg »

Und ja, die Zielpfade sind identisch ... erfolgreich kopiert und nicht erfolgreich kopiert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: FILECOPY(=

Beitrag 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?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: FILECOPY(=

Beitrag 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
gruss by OHR
Jimmy
Benutzeravatar
komnick
UDF-Programmierer
UDF-Programmierer
Beiträge: 75
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin
Hat sich bedankt: 1 Mal
Danksagung erhalten: 5 Mal

Re: FILECOPY(=

Beitrag 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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: FILECOPY(=

Beitrag von brandelh »

Bitte beachten, wir sind hier im CLIPPER Forum, daher vermute ich er verwendet CLIPPER als compiler :!:
Gruß
Hubert
Benutzeravatar
sherlogg
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Mo, 19. Nov 2012 14:59
Wohnort: Mühlheim am Main
Hat sich bedankt: 15 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: FILECOPY(=

Beitrag 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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: FILECOPY(=

Beitrag 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 ...
gruss by OHR
Jimmy
Benutzeravatar
sherlogg
UDF-Programmierer
UDF-Programmierer
Beiträge: 57
Registriert: Mo, 19. Nov 2012 14:59
Wohnort: Mühlheim am Main
Hat sich bedankt: 15 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: FILECOPY(=

Beitrag von sherlogg »

Hallo Jimmy,

ja, ich habe auch xBase++.

Werde ich mir mal einen Kopf machen.

Danke!

Gruß, Dieter
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: FILECOPY(=

Beitrag 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.
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten