AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Von BlockRead/BlockWrite wegkommen - IFileOperation steht bereit, aber kein CallBack
Thema durchsuchen
Ansicht
Themen-Optionen

Von BlockRead/BlockWrite wegkommen - IFileOperation steht bereit, aber kein CallBack

Ein Thema von dGeek · begonnen am 22. Sep 2016 · letzter Beitrag vom 25. Sep 2016
Antwort Antwort
Seite 1 von 2  1 2      
dGeek
(Gast)

n/a Beiträge
 
#1

Von BlockRead/BlockWrite wegkommen - IFileOperation steht bereit, aber kein CallBack

  Alt 22. Sep 2016, 23:02
Ich benutze nun seit einiger Zeit BlockRead und BlockWrite.
Das funktioniert perfekt, denn so kann ich auch meine ProgressBar füttern.

Diese alten Funktionen haben aber den Nachteil, dass sie manche offene Dateien nicht ohne Admin-Rechte kopieren können.

Deswegen benutze ich für kleine Dateien nun die IFileOperation-Funktionen die es seit Vista gibt (CopyFileIFileOperationForceDirectories):
http://zarko-gajic.iz.hr/replacing-s...l-delphi-code/

Wie kann ich mir mit dieser Funktion ein CallBack basteln?

Bei BlockRead/Write konnte ich immer schön in einer repeat-until-Schleife meine Variable "iBytesCopied" inkrementieren. Wie funktioniert das bei CopyFileIFileOperationForceDirectories?

  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Von BlockRead/BlockWrite wegkommen - IFileOperation steht bereit, aber kein CallB

  Alt 23. Sep 2016, 00:56
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Aber warum nicht FileStreams oder SHFileOperation?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#3

AW: Von BlockRead/BlockWrite wegkommen - IFileOperation steht bereit, aber kein CallB

  Alt 23. Sep 2016, 08:17
Hat SHFileOperation nicht eine Limitierung von 260 Zeichen für den kompletten Dateinamen? Bin mir da gerade nicht sicher.
Wie würde denn ein Callback für SHFileOperation aussehen?

Super kleine Dateien ohne Callback kopiere ich so:
Delphi-Quellcode:
 ZeroMemory(@fos, SizeOf(fos));
 
 with fos do
  begin
  wFunc := aFunc;
  fFlags := FOF_NO_UI;
  pFrom := PChar(aSource.sSourceDirItem + #0);
  pTo := PChar(aDest.sDestDirItem + #0);
 end;
 
 Result := (0 = SHFileOperation(fos));
Ich habe zwar hier ein Callback für CopyFileEx und komme auch da rein, aber ich bekomme nicht raus wieviele Bytes aktuell kopiert wurden:

Delphi-Quellcode:
function CopyCallback(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: Int64; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle)
 : DWORD; stdcall;
var
 newpos: Integer;
const
 PROCESS_CONTINUE = 0;
begin
 Result := PROCESS_CONTINUE;
 if dwCallbackReason = CALLBACK_CHUNK_FINISHED then
  begin
   // newpos := Round(TotalBytesTransferred / TotalFileSize * 100);

   Inc(aGlobalVars.iBytesCopied, StreamBytesTransferred); // Geht natürlich in die Hose

   // with progressform.Progressbar do
   // if newpos <> Position then
   // Position := newpos;

   Application.ProcessMessages;
  end;
end;

Geändert von dGeek (23. Sep 2016 um 09:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Von BlockRead/BlockWrite wegkommen - IFileOperation steht bereit, aber kein CallB

  Alt 23. Sep 2016, 09:55
Diese alten Funktionen haben aber den Nachteil, dass sie manche offene Dateien nicht ohne Admin-Rechte kopieren können.
Nein!

Du must nur den Filemode richtig setzen...

Ob Stream oder Blockread macht kaum einen Unterschied, den bei Routinen münden in die selben I/O Routinen, nur das Blockread/Write weniger overhead haben...
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#5

AW: Von BlockRead/BlockWrite wegkommen - IFileOperation steht bereit, aber kein CallB

  Alt 23. Sep 2016, 10:12
Nein!

Du must nur den Filemode richtig setzen...
Ups Ich wusste gar nicht, dass man das bei BlockRead und -Write setzen kann. Was ich auch nicht wusste ist, dass der FileMode standardmäßig auf ReadWrite steht.
Ich habe ihn nun auf fmOpenRead gesetzt und es funktioniert wunderbar!

Nur eine Frage: kann man, wenn FileMode auf fmOpenRead steht, die Datei dann noch löschen?
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Von BlockRead/BlockWrite wegkommen - IFileOperation steht bereit, aber kein CallB

  Alt 23. Sep 2016, 10:22
Du must die Share's per OR verknüpfen...

Aus System.Sysutils

Delphi-Quellcode:
  fmOpenRead = $0000;
  fmOpenWrite = $0001;
  fmOpenReadWrite = $0002;
  fmExclusive = $0004; // when used with FileCreate, atomically creates the file only if it doesn't exist, fails otherwise

  fmShareCompat = $0000 platform; // DOS compatibility mode is not portable
  fmShareExclusive = $0010;
  fmShareDenyWrite = $0020;
  fmShareDenyRead = $0030 platform; // write-only not supported on all platforms
  fmShareDenyNone = $0040;
Also

Filemode := $40; bzw.Filemode := fmOpenRead or fmShareDenyNone;

Geändert von Mavarik (23. Sep 2016 um 11:32 Uhr)
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#7

AW: Von BlockRead/BlockWrite wegkommen - IFileOperation steht bereit, aber kein CallB

  Alt 23. Sep 2016, 11:16
Klappt wunderbar, Danke!
ich habe jetzt folgendes Konstrukt für den absoluten Notall:

Delphi-Quellcode:
// - versuche Datei mit BlockRead und BlockWrite zu "kopieren"
// - - wenn sofort ein Fehler auftritt und nicht "kopiert werden konnte DANN
// - - - "kopiere" Datei mit den seit Vista mitgelieferten IFileOperation-Funktionen
// - - geht das schief, gib einen Fehler aus
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#8

AW: Von BlockRead/BlockWrite wegkommen - IFileOperation steht bereit, aber kein CallB

  Alt 25. Sep 2016, 14:30
Eine letzte Frage:
kann BlockRead und -Write auch Dateien mit überlangen Pfadnamen kopieren?
Denn soweit ich weiß können die IFileOperations Pfadnamen bis ~32.000 Zeichen kopieren.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#9

AW: Von BlockRead/BlockWrite wegkommen - IFileOperation steht bereit, aber kein CallB

  Alt 25. Sep 2016, 16:22
BlockRead und BlockWrite ist der Dateiname egal, denn Lese-/Schreibvorgänge arbeiten nur mit dem FileHandle.

Und wenn man 'ne Datei mit UNC öffnet, dann geht es auch mit Pfaden länger als MAX_PATH.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
dGeek
(Gast)

n/a Beiträge
 
#10

AW: Von BlockRead/BlockWrite wegkommen - IFileOperation steht bereit, aber kein CallB

  Alt 25. Sep 2016, 16:27
Zitat:
Und wenn man 'ne Datei mit UNC öffnet, dann geht es auch mit Pfaden länger als MAX_PATH.
Das klingt zwar interessant aber...

was wäre denn der UNC-Pfad zu z.B. D:\verzeichnis1\datei1.txt ?

Soweit ich jetzt rausgefunden habe in etwa so..

\\Computername\D$\verzeichnis1$\datei1.txt

?

Geändert von dGeek (25. Sep 2016 um 16:37 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz