Probleme mit Löschen in den Papierkorb (SHFileOperation_)

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Probleme mit Löschen in den Papierkorb (SHFileOperation_)

Beitrag von Agent »

Hallo!

Ich habe im forum einen Code gefunden, um Dateien in den Papierkorb zu schieben anstelle zu löschen. Den Code habe ich ein wenig "flexibler" gestaltet. Nach einigen Tests (auch mit dem original-Code) ist mir aufgefallen, das diese Funktion (SHFileOperation_) oft den Dienst verweigert. Der Grund ist mir nicht bewusst. Die Dateien sind weder ReadOnly noch sonstwas. Teilweise funktioniert es beim 2. Durchlauf.
Jemand eine Idee?

Hier die Proc:

Code: Alles auswählen

Procedure SK_RecycleFile(file$, ask.b=0, noerror.b=0, progress.b=0) ; PB3+4
  Define.l result

  ; #define FOF_SILENT      0x0004     // keine Angabe über  
  ;                                    // Fortschritt 
  ; #define FOF_NOERRORUI   0x0400     // keine Fehler-UI 
  ; #define FOF_ALLOWUNDO   0x0040     // für Papierkorb  
  ;                                    // erforderlich! 
  ; #define FOF_NOCONFIRMATION 0x0010  // keine Rückfrage

  SHFileOp.SHFILEOPSTRUCT 
  SHFileOp\pFrom=@file$ 
  SHFileOp\wFunc=#FO_DELETE 
  SHFileOp\fFlags=#FOF_ALLOWUNDO
  
  If ask=0
    SHFileOp\fFlags | #FOF_NOCONFIRMATION
  EndIf
  If noerror=0
    SHFileOp\fFlags | $0400
  EndIf
  If progress=0
    SHFileOp\fFlags | #FOF_SILENT
  EndIf
  
  result = SHFileOperation_(SHFileOp) 
  
  CompilerIf 1
    Debug "SK_Recyclefile: "+file$
    Debug "SK_Recyclefile: Result = "+Str(result)
  CompilerEndIf
  ; Liefert 0 (NULL) zurück wenn alles ok
  ; 1026 : Datei nicht vorhanden
  
  If result = 0
    result = #True
  Else
    result = #False
  EndIf
  
  ProcedureReturn result
EndProcedure 
Achso, ich verwende noch diese der Einfachheit halber:

Code: Alles auswählen

Structure DirInfo
 entryname$
 entrysize.f
 entrydate.l
 entryattribute.l
EndStructure 
NewList ReadAllFiles.DirInfo()

Procedure.l SK_ReadAllFiles(Path.s)
; Structure DirInfo
;  entryname$
;  entrysize.f
;  entrydate.l
;  entryattribute.l
; EndStructure 
; NewList ReadAllFiles.DirInfo()

  Shared ReadAllFiles()
  
  If Right(Path,1)<>"\" : Path+"\" : EndIf
  Dir.l=ExamineDirectory(#PB_Any, Path, "")
  
  If Dir
    While NextDirectoryEntry(Dir)       
      If DirectoryEntryType(Dir)=1 ; File
        ReadDir_found + 1
        name$=DirectoryEntryName(Dir)
        AddElement(ReadAllFiles())
        ReadAllFiles()\entryname$=Path+name$
        ReadAllFiles()\entrydate=DirectoryEntryDate(Dir, #PB_Date_Modified)
        ReadAllFiles()\entrysize=DirectoryEntrySize(Dir)
        ReadAllFiles()\entryattribute=DirectoryEntryAttributes(Dir)         
      ElseIf DirectoryEntryType(Dir) = 2 ; Dir
        name$=DirectoryEntryName(Dir)
        If name$<>"." And name$<>".."
          ReadDir_found + SK_ReadAllFiles(Path+DirectoryEntryName(Dir))
        EndIf
     EndIf     
   Wend
   
   FinishDirectory(Dir)  
 EndIf
  
  ProcedureReturn ReadDir_found

EndProcedure 
Danke für eure Hilfe.
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Agent
Beiträge: 296
Registriert: 13.09.2004 11:28
Kontaktdaten:

Beitrag von Agent »

Keiner ne Idee? oder Erfahrungen?
Agent_Sasori
It's not a bug - it's a feature!
http://www.StephenKalisch.de | http://www.ria-tec.com | http://www.dirsync.de
Antworten