Seite 1 von 3
Dateien löschen unter Windows 10Pro
Verfasst: Di, 20. Feb 2018 8:04
von saul
Hallo,
xbase Version 1.90.331
Code: Alles auswählen
adatloesch = Directory("*.pdf")
for I = 1 to len(adatloesch)
erase(adatloesch[ i, F_NAME ])
next
unter Windows 7 funktioniert einwandfrei. Unter Windows 10 bricht regelmäßig nach der dritten Datei ab.
Hat jemand so etwas schon mal bemerkt oder gehabt?
mfg
Wolfgang
Re: Dateien löschen unter Windows 10Pro
Verfasst: Di, 20. Feb 2018 8:40
von mini990
Guten Morgen,
Nimm doch einfach Filedelete()
Gruß Stefan
Re: Dateien löschen unter Windows 10Pro
Verfasst: Di, 20. Feb 2018 8:50
von Jan
Filedelete() liegt in den XbTools. FErase() liegt wie Erase() in XppRt1.dll
Jan
Re: Dateien löschen unter Windows 10Pro
Verfasst: Di, 20. Feb 2018 9:18
von Tom
FErase() arbeitet unter Windows 10 Pro genauso gut wie unter allen bisherigen Windows-Versionen. Und auch Xbase++ 1.9.331 wird nicht das Problem sein. Und FileDelete und die anderen Derivate zeigen sowieso auf die gleichen API-Funktionen.
Wie bricht die Löschung ab? Gibt es einen Laufzeitfehler? Oder wird einfach nicht mehr gelöscht? Wo zeigen Set(_SET_DEFAULT) und Set(_SET_PATH) hin? Welches ist das Arbeitsverzeichnis? Lässt sich die fragliche Datei an Position 3 direkt löschen (FErase("c:\meinverzeichnis\meinedatei.bullshit"))? Usw.
Re: Dateien löschen unter Windows 10Pro
Verfasst: Di, 20. Feb 2018 9:43
von brandelh
Es ist schon ewig her, aber ich meine ERASE liefert keine Fehler zurück wenn z.B. die Datei nicht gefunden wird ... wie TOM schrieb, welcher Fehler (am Besten die LOG Datei) tritt genau auf
ANSI oder OEM EXE ??? ich meine bei ERASE wird nicht automatisch convertiert ... wobei directory() sollte den namen richtig melden.
Re: Dateien löschen unter Windows 10Pro
Verfasst: Di, 20. Feb 2018 10:09
von Herbert
Mit filedelete kannst zusätzlich den Returncode auswerten.
Re: Dateien löschen unter Windows 10Pro
Verfasst: Di, 20. Feb 2018 10:51
von peternmb
Nach ähnlichen Problemen (auch beim Kopieren) gebe ich immer den kompletten Pfad der betreffenden Datei(en) an.
Re: Dateien löschen unter Windows 10Pro
Verfasst: Di, 20. Feb 2018 11:00
von Tom
Bevor wir hier noch endlos weiterspekulieren, sollte Wolfgang das "bricht regelmäßig ab" etwas genauer erklären, dann können wir weitaus präziser spekulieren.
Davon abgesehen: Tipps wie "Nimm doch einfach eine andere Funktion, vielleicht hast Du ja gerade einen Bug entdeckt, den vorher noch nie jemand gesehen hat, obwohl die Funktion von Tausenden eingesetzt wird" finde ich immer total hinreißend.
Und davon wiederum abgesehen:
http://www.alaska-software.com/scripts/ ... PDRID=6954
Re: Dateien löschen unter Windows 10Pro
Verfasst: Di, 20. Feb 2018 21:06
von Herbert
Der Loop von Wolfgang bricht offenbar immer nach der 3. Datei ab. Da könnte es doch gut sein (ja, Spekulation), dass die 4. Datei z.B. ganz einfach schreibgeschützt ist. Erase sagt aber dazu nichts.
Tom's Spekulation mit dem PDR würde doch gar keine Files löschen.
Aber lassen wir Wolfgang weiter erklären.
Re: Dateien löschen unter Windows 10Pro
Verfasst: Di, 20. Feb 2018 23:48
von AUGE_OHR
saul hat geschrieben: ↑Di, 20. Feb 2018 8:04
Code: Alles auswählen
adatloesch = Directory("*.pdf")
for I = 1 to len(adatloesch)
erase(adatloesch[ i, F_NAME ])
next
unter Windows 7 funktioniert einwandfrei.
hm ... schon mal mit /W compiliert in der CMD Box ?
Fehler Zeile 1
muss heissen
saul hat geschrieben:Unter Windows 10 bricht regelmäßig nach der dritten Datei ab.
wundert mich das es sich bei dir linken lässt
er sagt er kennt "erase" nicht was ja richtig ist den so eine Function hast du wahrscheinlich nicht.
also probiere es mal mit
Code: Alles auswählen
ERASE (adatloesch[ i, F_NAME ]) // GROSS und Leerzeichen !
wobei ich lieber die Function FERASE()
verwende da die mir sofort einen Rückgabewert gibt. (muss man sonst über FError() ermitteln)
p.s. Bevor eine Datei gelöscht wird, muss sie gegebenenfalls erst geschlossen werden
Re: Dateien löschen unter Windows 10Pro
Verfasst: Mi, 21. Feb 2018 6:45
von Jan
Jimmy,
was hat Dich denn da geritten?
AUGE_OHR hat geschrieben: ↑Di, 20. Feb 2018 23:48
Fehler Zeile 1
muss heissen
Natürlich geht das auch mit =. In diesem Fall. Sicher ist := als Zuweisungsoperator korrekt. Aber es geht auch ganz klassisch per Verglecihsoperator. Ohne Fehlermeldungen doer Laufzeitprobleme.
AUGE_OHR hat geschrieben: ↑Di, 20. Feb 2018 23:48saul hat geschrieben:Unter Windows 10 bricht regelmäßig nach der dritten Datei ab.
wundert mich das es sich bei dir linken lässt
er sagt er kennt "erase" nicht was ja richtig ist den so eine Function hast du wahrscheinlich nicht.
also probiere es mal mit
Code: Alles auswählen
ERASE (adatloesch[ i, F_NAME ]) // GROSS und Leerzeichen !
Wieso sollte er ERASE nicht kennen? Gibt es doch. Und der bricht ja auch erst nachd em 3. Durchlauf ab, hat das also schon 2x durchgeführt. Und warum soll er ERASE groß schrieben? Ist unter Xbase++ doch vollkommen egal. Und die Leerzeichen aus der Klammersetzung entfernen? Ist doch alles vollkommen egal und persönlicher Stil (Die Leerzeichen innerhalb der Klammer stören mich auch, aber bei Alaska-Samples sind die Standard - also reiner persönlicher Geschmack).
AUGE_OHR hat geschrieben: ↑Di, 20. Feb 2018 23:48wobei ich lieber die Function FERASE()
verwende da die mir sofort einen Rückgabewert gibt. (muss man sonst über FError() ermitteln)
Korrekt. Aber es geht ja schließlich beides, ERASE ist also nicht ganz falsch. Nur etwas aufwändiger.
AUGE_OHR hat geschrieben: ↑Di, 20. Feb 2018 23:48p.s. Bevor eine Datei gelöscht wird, muss sie gegebenenfalls erst geschlossen werden
Hatten wir weiter oben schon.
Jan
Re: Dateien löschen unter Windows 10Pro
Verfasst: Mi, 21. Feb 2018 6:49
von Martin Altmann
Jan,
Jan hat geschrieben: ↑Mi, 21. Feb 2018 6:45
AUGE_OHR hat geschrieben: ↑Di, 20. Feb 2018 23:48
Code: Alles auswählen
ERASE (adatloesch[ i, F_NAME ]) // GROSS und Leerzeichen !
Wieso sollte er ERASE nicht kennen? Gibt es doch. Und der bricht ja auch erst nachd em 3. Durchlauf ab, hat das also schon 2x durchgeführt. Und warum soll er ERASE groß schrieben? Ist unter Xbase++ doch vollkommen egal. Und die Leerzeichen aus der Klammersetzung entfernen? Ist doch alles vollkommen egal und persönlicher Stil (Die Leerzeichen innerhalb der Klammer stören mich auch, aber bei Alaska-Samples sind die Standard - also reiner persönlicher Geschmack).
das hast Du falsch verstanden! Jimmy meinte das Leerzeichen nach Erase und vor der öffnenen Klammer! Erase ist keine Funktion, sondern ein Kommando.
Viele Grüße,
Martin
Re: Dateien löschen unter Windows 10Pro
Verfasst: Mi, 21. Feb 2018 7:07
von AUGE_OHR
Code: Alles auswählen
#include "Directry.ch"
PROCEDURE MAIN
LOCAL adatloesch = Directory("*.bak")
local i
cls
for I := 1 to len(adatloesch)
erase (adatloesch[ i, F_NAME ])
next
wait
return
1 x compile und 1 x link fehler. ODER
Re: Dateien löschen unter Windows 10Pro
Verfasst: Mi, 21. Feb 2018 7:14
von Jan
Martin Altmann hat geschrieben: ↑Mi, 21. Feb 2018 6:49das hast Du falsch verstanden! Jimmy meinte das Leerzeichen nach Erase und vor der öffnenen Klammer! Erase ist keine Funktion, sondern ein Kommando.
Ah! OK, das hatte ich nicht direkt so gesehen. Stellt sich mir aber die Frage, ob das wirklich schlimm ist. Denn Wolfgang hat das ja ans Laufen bekommen, sein Fehler ist erst zur Laufzeit, und da auch erst im wiederholten Durchlauf, ausgetreten. Muß ich nachher mal ausprobieren, ob das Leerzeichen wirklich stört.
Jan
Re: Dateien löschen unter Windows 10Pro
Verfasst: Mi, 21. Feb 2018 7:26
von Tom
1 x compile und 1 x link fehler. ODER
Yo. Weil Du den Code verändert hast.
Re: Dateien löschen unter Windows 10Pro
Verfasst: Mi, 21. Feb 2018 9:05
von brandelh
Der Parser ist sehr flexibel was Blanks zwischen Funktionen / Befehlen und Klammern angeht!
Das wird anstandslos compiliert und läuft ohne Fehler durch (Win 7):
Code: Alles auswählen
// d:\test\t.xxx gibt es nicht ;-)
ERASE("d:\test\t.xxx")
DELETE file ("d:\test\t.xxx")
erase d:\test\t.xxx
DELETE file d:\test\t.xxx
? "fieledelete", filedelete ("d:\test\t.xxx") // => .f.
? "deletefile: ", deletefile ("d:\test\t.xxx") // => -2
Re: Dateien löschen unter Windows 10Pro
Verfasst: Mi, 21. Feb 2018 9:29
von Tom
Der Zuweisungsoperator ":="
muss verwendet werden, wenn es um explizite Deklarationen geht, also um eine Programmzeile, die mit "LOCAL", "STATIC", "PUBLIC" oder "PRIVATE" beginnt - oder wenn explizit kein Vergleich stattfinden soll, denn das hier:
und das hier
sind zwei unterschiedliche Programmzeilen. Die zweite crasht zur Laufzeit, wenn y keine logische Variable ist.
Dritte Anwendung: Das Ersetzen von Tabellenfeldern (anstelle von REPLACE oder FieldPut).
Ansonsten hat "=" die gleiche Wirkung.
Und Kommandos können groß oder klein oder sogar gemischt geschrieben werden, das ist völlig egal. Nur Konstantenersetzungen sind case-sensitive.
Warten wir doch einfach mal ab, was Wolfgang dann irgendwann darüber erzählt, wie sich das Verhalten
genau darstellt.
Re: Dateien löschen unter Windows 10Pro
Verfasst: Mi, 21. Feb 2018 12:19
von Tom
So oder so. Windows 10 Prof., 64 bit. Aus diesem Code (der sich nur durch die INCLUDE-Ergänzung und die Ausgabezeile von Wolfgangs Original unterscheidet) "test.exe" erzeugt und in einem Verzeichnis gestartet, das bis zum Start 6 PDF-Dateien enthielt. Nach dem Durchlauf war keine mehr übrig.
Code: Alles auswählen
#include "directry.ch"
function main()
adatloesch = Directory("*.pdf")
for I = 1 to len(adatloesch)
? adatloesch[ i, F_NAME ]
erase(adatloesch[ i, F_NAME ])
next
return nil
Edit: Schreibgeschützte Dateien werden einfach übersprungen. Dateien mit Umlauten und Sonderzeichen werden auch gelöscht. Alles fein.
Re: Dateien löschen unter Windows 10Pro
Verfasst: Mi, 21. Feb 2018 12:59
von brandelh
TOM war schneller
dennoch schreibe ich das hier, denn mein Test war mit 2.00 und 1.90.355 unter Win 10 Pro
Alles gut, keine Fehlermeldung wegen der nicht existierenden Datei
"NotExistingFile.PDF"
Die xxx Dateien, welche kurz zuvor erzeugt wurden, wurden wieder gelöscht und fexists() gibt die fehlende Datei auch mit .f. zurück.
Code: Alles auswählen
#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Inkey.ch"
#include "directry.ch"
#include "DLL.ch"
procedure main
local aD, nAnz, i
aD := directory("*.xxx")
nAnz := len(aD)
? "Anzahl Dateien: ",nAnz
for i := 1 to nAnz
erase ("NotExistingFile.PDF")
? i,ad[i,F_NAME]
erase (ad[i,F_NAME])
?? " ",fexists(ad[i,F_NAME])
next
? "ende"
inkey(20)
return
Re: Dateien löschen unter Windows 10Pro
Verfasst: Mi, 21. Feb 2018 13:11
von Tom
ERASE wird übrigens vom PP in FErase() umgewandelt.
Re: Dateien löschen unter Windows 10Pro
Verfasst: Mi, 21. Feb 2018 18:08
von AUGE_OHR
ok habe "meinen" Fehler gefunden
das lässt sich "so" nicht linken.
aber es geht um das Allgemeine das man erst solche Code Schnipsel zusammenfügen muss um ein lauffähiges Demo zu bekommen. auch hasse ich es "Warnungen" zu bekommen wenn was nicht deklariert wurde.
das Problem von Wolfgang kann ich jedenfalls so nicht nachvollziehen ... da passieren noch andere Sachen vorher.
Re: Dateien löschen unter Windows 10Pro
Verfasst: Mi, 21. Feb 2018 23:26
von azzo
Hallo,
vielleicht hängt es auch damit zusammen:
Reported by Alaska:
// Caution: Windows 10 Fall Creators Update
Our final tests with Windows 10 Version 1709 (Fall Creators Update) revealed timing issues with the
local file system, which may lead to changed application behavior as well as application runtime
errors. In fact, all coding patterns which first delete a file on the local storage and then assume
the file is gone may fail. This is valid for all programming languages used as the behaviour is
introduced on the Windows API/file-system level. In other words, an FErase( "test.dbf" ) may lead to
File( "test.dbf" ) == .T. in some but not all cases.
With that finding in mind we can not recommend updating production systems right now to Windows 10
Fall Creators Update.
LG
Otto
Re: Dateien löschen unter Windows 10Pro
Verfasst: Do, 22. Feb 2018 5:56
von AUGE_OHR
azzo hat geschrieben: ↑Mi, 21. Feb 2018 23:26
vielleicht hängt es auch damit zusammen:
Reported by Alaska:
das war die PDR
6954 welche Tom angesprochen hatte
http://www.alaska-software.com/scripts/ ... PDRID=6954
es geht ja nur um das löschen in einer schleife wo es knallt bei Wolfgang. Ich kann das bei mir nicht nachvollziehen.
bei einem ERASE / FErase() sollte es nicht knallen auch wenn die Datei nicht existiert ... was man vorher überprüfen könnte
Code: Alles auswählen
#include "directry.ch"
function main()
LOCAL adatloesch := Directory("*.obj")
LOCAL I, cFile
for I := 1 to len(adatloesch)
cFile := adatloesch[ i, F_NAME ]
IF FILE(cFile)
IF FErase(cFile) = -1
Msgbox("Fehler beim löschen der Datei: "+cFile, "Error "+ LTRIM(STR( FError() )) )
ENDIF
ENDIF
next
return nil
Anmerkung : auch in der
FOR Zeile sollte man IMHO ein ":=" statt "=" verwenden wie es in der Hilfe steht.
Code: Alles auswählen
FOR <CounterVar> := <nStart> TO <nEnd> [STEP <nStep>]
Re: Dateien löschen unter Windows 10Pro
Verfasst: Do, 22. Feb 2018 6:43
von Tom
= und := sind in vielen Situationen völlig gleichwertig. Und Dein Beispiel funzt nicht, weil in einer Programmzeile keine zwei Kommandos aufeinander folgen dürfen. Ansonsten ist alles gesagt; Wolfgang müsste sich endlich mal äußern.
Re: Dateien löschen unter Windows 10Pro
Verfasst: Do, 22. Feb 2018 9:57
von azzo
Hallo,
im FW-Forum wurde folgendes Workaround vorgeschlagen:
Maybe doing a Sysrefresh() before the File() would be a workaround.
If that works, you could create your own file checking routine:
Sysrefresh() ist eine FW function ( Do Event )
function xfile()
Sysrefresh()
Return File()
LG
Otto