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. :wink: 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. 8)
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

Code: Alles auswählen

adatloesch = Directory("*.pdf")
muss heissen

Code: Alles auswählen

adatloesch := Directory("*.pdf")
saul hat geschrieben:Unter Windows 10 bricht regelmäßig nach der dritten Datei ab.
wundert mich das es sich bei dir linken lässt :roll:

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()

Code: Alles auswählen

   nErr := FERASE(adatloesch[ i, F_NAME ]) 
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 :badgrin:

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

Code: Alles auswählen

adatloesch = Directory("*.pdf")
muss heissen

Code: Alles auswählen

adatloesch := Directory("*.pdf")
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:48
saul hat geschrieben:Unter Windows 10 bricht regelmäßig nach der dritten Datei ab.
wundert mich das es sich bei dir linken lässt :roll:

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()

Code: Alles auswählen

   nErr := FERASE(adatloesch[ i, F_NAME ]) 
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 :badgrin:
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. :wink:

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:

Code: Alles auswählen

IF x = y
und das hier

Code: Alles auswählen

IF x := y
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. :wink:

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

Code: Alles auswählen

     ?  erase (adatloesch[ i, F_NAME ])
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