AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Beschädigte Datei retten ?

Ein Thema von Cicaro · begonnen am 17. Jul 2011 · letzter Beitrag vom 29. Jul 2011
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von DelphiSecurity
DelphiSecurity

Registriert seit: 10. Jan 2011
170 Beiträge
 
Delphi XE Architect
 
#11

AW: Beschädigte Datei retten ?

  Alt 19. Jul 2011, 08:31
HIER KLICKEN, IST DAS BESTE
(C) DelphiSecurity 2011 | Delphi XE
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Beschädigte Datei retten ?

  Alt 19. Jul 2011, 08:45
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (19. Jul 2011 um 08:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

AW: Beschädigte Datei retten ?

  Alt 19. Jul 2011, 09:31
Wie willst du an dem Treiber vorbeikommen? Der Treiber ist die einzige Schnittstelle zur Hardware.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Beschädigte Datei retten ?

  Alt 19. Jul 2011, 09:56
Nja, über Overlapptoperationen und mit Threads kann man versuchen eine Art Timeout für die Leseoperation einzubauen und so das Hängenbleiben zu umgehen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

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

AW: Beschädigte Datei retten ?

  Alt 19. Jul 2011, 10:13
Dann hast du dich aber falsch ausgedrückt. Denn ohne Treiber keinen Zugriff auf die Hardware.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Beschädigte Datei retten ?

  Alt 20. Jul 2011, 02:44
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.
Angehängte Dateien
Dateityp: zip Project1.zip (386,6 KB, 8x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#17

AW: Beschädigte Datei retten ?

  Alt 20. Jul 2011, 05:40
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?
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Beschädigte Datei retten ?

  Alt 20. Jul 2011, 08:18
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (20. Jul 2011 um 09:51 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#19

AW: Beschädigte Datei retten ?

  Alt 20. Jul 2011, 09:29
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#20

AW: Beschädigte Datei retten ?

  Alt 20. Jul 2011, 10:52
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 15:55 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