Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Klatsch und Tratsch (https://www.delphipraxis.net/34-klatsch-und-tratsch/)
-   -   Beschädigte Datei retten ? (https://www.delphipraxis.net/161717-beschaedigte-datei-retten.html)

DelphiSecurity 19. Jul 2011 08:31

AW: Beschädigte Datei retten ?
 
HIER KLICKEN, IST DAS BESTE

himitsu 19. Jul 2011 08:45

AW: Beschädigte Datei retten ?
 
Bekommst du eine Provision, oder warum diese Schrift?

Es wurde schon genannt und wenn ich es richtig verstanden hab, dann wurde es schon erfolglos ausprobiert.

Außerdem: Das Teil ist schlecht programmiert und funktioniert bei Weitem nicht so gut, wie überall angepriesen. (Gründe hatte ich schon genannt)
Ja, ich hatte auch schon defekte CDs und bin über dieses Programm gestolpert. :wall:

Luckie 19. Jul 2011 09:31

AW: Beschädigte Datei retten ?
 
Wie willst du an dem Treiber vorbeikommen? Der Treiber ist die einzige Schnittstelle zur Hardware.

himitsu 19. Jul 2011 09:56

AW: Beschädigte Datei retten ?
 
Nja, über Overlapptoperationen und mit Threads kann man versuchen eine Art Timeout für die Leseoperation einzubauen und so das Hängenbleiben zu umgehen.

Luckie 19. Jul 2011 10:13

AW: Beschädigte Datei retten ?
 
Dann hast du dich aber falsch ausgedrückt. Denn ohne Treiber keinen Zugriff auf die Hardware.

himitsu 20. Jul 2011 02:44

AW: Beschädigte Datei retten ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Was hat Checkdisk nun eigentlich zu deiner Festplatte gesagt?


AsyncIO ist noch nicht richtig implementiert, die Threadbehandlung ist sehr disoptimal und beim Einlesen von intakten Sektoren könnte man über eine halbwegs "intelligente" Verwaltung noch so einiges zusammenfassen/beschleunigen.
Keine Ahnung, ob es schon reicht, um den hängenden Leseprozess zu umgehen.


Delphi-Quellcode:
procedure ShowError(ErrorMessage: String);
var
  E: HRESULT;
begin
  E := GetLastError;
  raise Exception.Create(ErrorMessage + ':' + sLineBreak + SysErrorMessage(E));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i, O: THandle;
  P, L: Int64;
  S, X, C, W, V: LongWord;
  T: TOverlapped;
  B: array of Byte;
  Q: LongInt;
begin
  if not GetDiskFreeSpace(PChar(ExtractFileDir(ButtonedEdit1.Text)), X, S, X, X) then S := 4096;
  i := INVALID_HANDLE_VALUE;
  O := INVALID_HANDLE_VALUE;
  try
    i := CreateFile(PChar(ButtonedEdit1.Text), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING or FILE_FLAG_OVERLAPPED or FILE_FLAG_SEQUENTIAL_SCAN, 0);
    if i = INVALID_HANDLE_VALUE then ShowError('Kann Quelldatei nicht öffnen');
    O := CreateFile(PChar(ButtonedEdit2.Text), GENERIC_WRITE, FILE_SHARE_READ, nil, CREATE_ALWAYS,
      FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING or FILE_FLAG_SEQUENTIAL_SCAN, 0);
    if O = INVALID_HANDLE_VALUE then ShowError('Kann Zieldatei nicht öffnen');
    Int64Rec(L).Lo := GetFileSize(i, @Int64Rec(L).Hi);
    if L = INVALID_FILE_SIZE then ShowError('Dateigröße nicht lesbar');
    SetLength(B, S);
    V := GetTickCount;
    P := 0;
    while (P < L) and not Application.Terminated do
      try
        if GetTickCount - V > 150 then begin
          Label2.Caption := Format('%.0n / %.0n', [P / 1, L / 1]);
          ProgressBar1.Position := (P * 1000) div L;
          Application.ProcessMessages;
          V := GetTickCount;
        end;
        if CheckBox1.Checked then begin
          T.InternalHigh := 0;  // reset OverlappedResult
          T.InternalHigh := 0;  //
          T.Offset    := Int64Rec(P).Lo;
          T.OffsetHigh := Int64Rec(P).Hi;
          Q := 0;
          TSimpleThread.Create(procedure
            begin
              try
                ReadFile(i, B[0], S, X, @T);
                if not GetOverlappedResult(i, T, C, True) or (C <> S) Then ShowError('Lesefehler');
                InterlockedExchange(Q, 1);
              except
                InterlockedExchange(Q, 2);
                raise;
              end;
            end);
          W := GetTickCount;
          while (Q < 1) and (GetTickCount - W < 15000) do begin
            Application.ProcessMessages;
            Sleep(10);
          end;
          if Q = 0 then begin
            TSimpleThread.Create(procedure
              begin
                try
                  CancelIoEx(i, T);
                  InterlockedExchange(Q, 3);
                except
                  InterlockedExchange(Q, 4);
                  raise;
                end;
              end);
            W := GetTickCount;
            while (Q < 3) and (GetTickCount - W < 500) do begin
              Application.ProcessMessages;
              Sleep(10);
            end;
          end else if Q <> 1 then Exit;
        end else begin
          T.InternalHigh := 0;  // reset OverlappedResult
          T.InternalHigh := 0;  //
          T.Offset    := Int64Rec(P).Lo;
          T.OffsetHigh := Int64Rec(P).Hi;
          ReadFile(i, B[0], S, X, @T);
          if not GetOverlappedResult(i, T, C, True) or (C <> S) Then ShowError('Lesefehler');
        end;
        X := Int64Rec(P).Hi;
        if (SetFilePointer(O, Int64Rec(P).Lo, @X, FILE_BEGIN) <> Int64Rec(P).Lo) or (X <> Int64Rec(P).Hi) then
          ShowError('Positionsfehler');
        X := Min(L - P, S);
        if not WriteFile(O, B[0], X, C, nil) or (C <> X) then ShowError('Schreibfehler');
        Inc(P, S);
      except
        Inc(P, S);
      end;
  finally
    CloseHandle(O);
    CloseHandle(i);
    CloseHandle(T.hEvent);
  end;
end;
Die Edits sollten eine Autovervollständigung (beim Schreiben), Drag&Drop und Dateiauswahldialoge bieten.

FredlFesl 20. Jul 2011 05:40

AW: Beschädigte Datei retten ?
 
Nur mal so: Wieso bimmeln hier keine Alarmglocken?
Ich meine "große AVI-Datei"? Kopierproblem?

Kann man nicht mal klären, was in der AVI-Datei so drin ist?
Darf der Threadersteller das überhaupt *kopieren*? Gibts da nicht sowas wie Copyright und so?

Sind die Fragen geklärt oder ich zu paranoid?

himitsu 20. Jul 2011 08:18

AW: Beschädigte Datei retten ?
 
Keine Sorge, mein Code umgeht keinen Kopierschutz, wie z.B. CSS und Co. (welcher eh schon lange geknackt ist und sich mit entsprechenden Programmen leichter entschlüsseln ließe).

PS: Besagte DVD-Dateien wären maximal auch nur 2 GB und nicht 4.

Medium 20. Jul 2011 09:29

AW: Beschädigte Datei retten ?
 
Zitat:

Zitat von FredlFesl (Beitrag 1112651)
Sind die Fragen geklärt oder ich zu paranoid?

Letzteres. Noch nie ein Urlaubsvideo vom Digi-Camcorder am PC geschnitten, was? ;) Allein aus "ich habe ein 4GiB Video" gleich einen Verdacht zu konstruieren finde ich reichlich anmaßend.

p80286 20. Jul 2011 10:52

AW: Beschädigte Datei retten ?
 
Ich habe auch schon mal defekte DVDs oder CDs auslesen müssen, da funktionierte der code aus #5 allerdings.
(Gut ich hatte einen Buffer dazwischen gepackt und massig Zeit)

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:57 Uhr.
Seite 2 von 4     12 34      

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