AGB  ·  Datenschutz  ·  Impressum  







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

Datei als array of byte einlesen

Ein Thema von tofse · begonnen am 30. Okt 2017 · letzter Beitrag vom 6. Nov 2017
Antwort Antwort
Seite 1 von 3  1 23      
tofse

Registriert seit: 6. Jun 2011
Ort: Saarlouis
131 Beiträge
 
Delphi XE Professional
 
#1

Datei als array of byte einlesen

  Alt 30. Okt 2017, 14:42
Hallo,

ich muss Dateien byte-weise einlesen, und verwende folgenden Code

Code:
var buffer : array of byte;
    afile: file of byte;
    i:Integer;
begin
    AssignFile(afile, FPdf);
    Reset(afile);
    SetLength(buffer, FileSize(afile));
    For i := 1 to FileSize(afile) do
       Read(afile, buffer[i]);
    CloseFile(afile);
end;
Das Problem ist, wenn ich das durchlaufen lasse, klappt es zu 80%, manchmal kommt dann ein E/A - Fehler 32. Das ist meistens der Fall, wenn im Win Explorer die Datei noch fokusiert ist.
Während der Entwicklung habe ich hier immer das gleiche PDF, es kann also nicht an der Datei selber liegen. Denn auch wenn ich den Explorer dann schließe, und es nochmal durchlaufen lasse, klappt es dann.

Gibt es eine zuverlässigere Routine, um die Datei als array of byte einzulesen oder geht das generell nicht, wenn die Datei noch fokusiert ist?

Danke
Christof
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Datei als array of byte einlesen

  Alt 30. Okt 2017, 14:57
Immer diese uralten Turbo Pascal Datei-Funktionen
Delphi-Quellcode:
var buffer: array of byte;
    i:Integer;
    datei: TFileStream;
begin
  datei := TFileStream.Create(FPdf, fmOpenRead);
  try
    SetLength(buffer, datei.Size);
    datei.Read(buffer[0], datei.Size);
  finally
    datei.Free;
  end;
end;
Falls das Problem trotzdem auftritt könnte das Problem eine Shell Extension sein, die eine Vorschau der PDF im Explorer anzeigt und die PDF dafür exklusiv öffnet.
Dann kannst du da nicht wirklich was machen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
tofse

Registriert seit: 6. Jun 2011
Ort: Saarlouis
131 Beiträge
 
Delphi XE Professional
 
#3

AW: Datei als array of byte einlesen

  Alt 30. Okt 2017, 15:26
Hallo,
danke für die schnelle Antwort.
Leider funktioniert das nicht, wie gewünscht. Es läuft alles ohne Fehler durch, aber ich muss das array of byte ja an eine Funktion übergeben, die nicht von mir ist.
Die Verarbeitung läuft auch durch, aber das, was am Ende rauskommt, lässt sich nicht mehr öffnen. Das ist jetzt schwer im Detail zu erklären, aber die Funktion packt das PDF in einen DICOM container, nachdem es als array of byte eingelesen wurde und schickt es an einen Server. Dort lässt sich das DICOM dann nicht weiterverarbeiten. Mit der anderen Routine von mir klappt das.

Gruß
Christof
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: Datei als array of byte einlesen

  Alt 30. Okt 2017, 15:43
Es gibt die globale Variabel FileMode, über die gesteuert wird, wie eine Datei geöffnet wird und was andere gleichzeitig mit der Datei machen dürfen.

Der Standard ist fmOpenReadWrite, das dürfte für dich aber nicht relevant sein. Versuch es mal mit:

fmShareDenyNone. Andere haben uneingeschränkten Zugriff.

Oder eventuell:

fmOpenRead. Nur Lesezugriff.

Ansonsten hier mal nachschauen: http://docwiki.embarcadero.com/Libra...ystem.FileMode
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Datei als array of byte einlesen

  Alt 30. Okt 2017, 16:04
Hallo,
danke für die schnelle Antwort.
Leider funktioniert das nicht, wie gewünscht. Es läuft alles ohne Fehler durch, aber ich muss das array of byte ja an eine Funktion übergeben, die nicht von mir ist.
Die Verarbeitung läuft auch durch, aber das, was am Ende rauskommt, lässt sich nicht mehr öffnen. Das ist jetzt schwer im Detail zu erklären, aber die Funktion packt das PDF in einen DICOM container, nachdem es als array of byte eingelesen wurde und schickt es an einen Server. Dort lässt sich das DICOM dann nicht weiterverarbeiten. Mit der anderen Routine von mir klappt das.
Ich behaupte einfach mal ganz dreist dass, das nicht an meiner Methode liegt.
In dem buffer-Array sollte am Ende von deiner und meiner Methode exakt das gleiche drin stehen.

Und wenn dus schon mit den uralt-Funktionen machst, dann lies bitte nicht jedes Byte einzeln aus der Datei :/
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Datei als array of byte einlesen

  Alt 30. Okt 2017, 16:43
..aber ich muss das array of byte ja an eine Funktion übergeben, die nicht von mir ist.
Ja und?
Array of Byte ist Array of Byte! oder soll es statt "dynamisch" "statisch" sein?
dann könnte u.U das filesize etwas groß sein?!
Die Verarbeitung läuft auch durch, aber das, was am Ende rauskommt, lässt sich nicht mehr öffnen.
Beschreib doch mal "was am Ende rauskommt"
Das klingt als sei es eine Datei.

Gruß
K-H

P.S.
Ich stimme mit Neutral General überein, an seiner Methode liegt es nicht.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#7

AW: Datei als array of byte einlesen

  Alt 30. Okt 2017, 17:45
In s3iner Methode ist alles um 1 byte nach hinten verschoben, weil die Zählvariable bei eins los geht. Dqher wuch der Fehler, weil der buffer zu klein ist.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Datei als array of byte einlesen

  Alt 30. Okt 2017, 20:38
Ich werfe noch Delphi-Referenz durchsuchenTBytesStream in die Runde.

Es gibt die globale Variabel FileMode, über die gesteuert wird, wie eine Datei geöffnet wird und was andere gleichzeitig mit der Datei machen dürfen.

Der Standard ist fmOpenReadWrite, das dürfte für dich aber nicht relevant sein. Versuch es mal mit:

fmShareDenyNone. Andere haben uneingeschränkten Zugriff.

Oder eventuell:

fmOpenRead. Nur Lesezugriff.

Ansonsten hier mal nachschauen: http://docwiki.embarcadero.com/Libra...ystem.FileMode
Mich irritiert der Satz in der Doku: "Hinweis: Unter Windows wird der Parameter Rights ignoriert."
Ist das wirklich so? Also zumindest bei fmCreate kann man Rights nicht angeben (ist immer fmShareExclusive), aber beim Rest ging das glaube ich...
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#9

AW: Datei als array of byte einlesen

  Alt 31. Okt 2017, 10:52
Mich irritiert der Satz in der Doku: "Hinweis: Unter Windows wird der Parameter Rights ignoriert."
Ist das wirklich so?
Da hat die Doku durchaus Recht! Die fmShareXXX Attribute müssen mit dem Mode-Parameter (fmCreate/fmOpenXXX) per OR verknüpft werden. Der Parameter Rights wird unter Windows nicht ausgewertet.

Also zumindest bei fmCreate kann man Rights nicht angeben (ist immer fmShareExclusive), aber beim Rest ging das glaube ich...
Das stimmt nicht so ganz. Bei fmCreate wird nur dann fmShareExclusive verwendet, wenn als Mode $FFFF bzw. fmCreate OR $FF übergeben wird. Dabei wird aber auch das fmCreate quasi herausgenommen und eben nur fmShareExclusive übergeben.

Der Rights-Parameter wird sogar ausschließlich beim fmCreate ausgewertet und das auch nur unter POSIX. Dabei wird die Datei mit den angegebenen Zugriffsrechten angelegt. Beim Öffnen einer existierenden Datei würde das Ändern der Zugriffsrechte ja auch keinen Sinn ergeben.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.051 Beiträge
 
Delphi 2009 Professional
 
#10

AW: Datei als array of byte einlesen

  Alt 31. Okt 2017, 11:28
Wie kann ich denn bei TFileStream eine Datei nicht-exklusiv erstellen und öffnen?
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 11:58 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