Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Hilfe bei datei auslesen (https://www.delphipraxis.net/24697-hilfe-bei-datei-auslesen.html)

Pseudemys Nelsoni 24. Jun 2004 17:14


Hilfe bei datei auslesen
 
hallo 8)

ich habe folgendes:


Delphi-Quellcode:
          lstrcat(buf, '\testordner\datei');
          MessageBox(0, buf, 'jo', 0);
          AssignFile(hFile, string(buf));
          Reset(hFile);
irgendwie bekomme ich folgenden runtime error:

"Runtime Error 3 at 0042... usw"

wenn ich das "Reset" in meinem code auskommentiere passiert das nicht...was ist daran denn falsch?

Christian Seehase 24. Jun 2004 17:17

Re: Hilfe bei datei auslesen
 
Moin Pseudemys Nelsoni,

wie ist denn hFile deklariert?

Pseudemys Nelsoni 24. Jun 2004 17:19

Re: Hilfe bei datei auslesen
 
hallo christian,

als "TextFile". Die Datei hat zwar nicht die Endung ".txt"(um genau zu sein - sie hat gar keine Endung), aber sie enthält nur Text, das dürfte der fehler doch nicht sein oder?

Muetze1 24. Jun 2004 17:24

Re: Hilfe bei datei auslesen
 
Moin!

Ich habe mir gerade mal die Fehlermeldung 3 im Klartext ausgeben lassen mit ShowMessage(SysErrorMessage(3)); und dabei kam raus, dass es "Das System kann den angegebenen Pfad nicht finden" ist. Ergo: Deine Dateiangabe / -pfad stimmen nicht.

MfG
Muetze1

Pseudemys Nelsoni 24. Jun 2004 17:26

Re: Hilfe bei datei auslesen
 
hallo mütze,

also die datei existiert aber 100%

kann das sein das "/datei" als ordner angesehen wird weil keine endung dran ist? wenn ja, was kann ich dann tun?

Pseudemys Nelsoni 24. Jun 2004 17:29

Re: Hilfe bei datei auslesen
 
Ah, nun gehts,

danke an euch beide :mrgreen:

es fehlte doch ein ordner da zwischen :oops:


EDIT: nun bekomme ich noch den Fehler "6"... angeblich kein gültiges handle... wie prüf ich ob das handle ein handle ist? <> nil und <> 0 gehen nicht :\

Christian Seehase 24. Jun 2004 17:38

Re: Hilfe bei datei auslesen
 
Moin Pseudemys Nelsoni,

ein Handle ist dann ungültig wenn es den Wert INVALID_HANDLE_VALUE hat (Windows Konstante, als integer -1 )

Pseudemys Nelsoni 24. Jun 2004 17:46

Re: Hilfe bei datei auslesen
 
hallo christian^^

da kommen wieder 2 Fragen auf...

1. if hFile <> INVALID_HANDLE_VALUE then << Das hier funktioniert nicht, "Inkompatible Typen".
2. Wieso kommt überhaupt der fehler eines fehlenden handles? ich habe doch die datei mit:

"AssignFile(hFile, string(buf));"

geöffnet oder?

Christian Seehase 24. Jun 2004 17:56

Re: Hilfe bei datei auslesen
 
Moin Pseudemys Nelsoni,

mit AssignFile tust Du im System gar nichts.
Hier wird nur intern für Delphi eine Verbindung zwischen der Dateivariablen und dem Pfad zu der Datei angelegt.
Erst Reset führt zu einer Aktion im System.

Pseudemys Nelsoni 24. Jun 2004 18:03

Re: Hilfe bei datei auslesen
 
hallo christian,

aber reset hab ich ja auch drinnen und ich bekomme trotzdem den fehler "Runtime error 6...".
So hatte ich es bis jetzt:

Delphi-Quellcode:
        begin
          lstrcat(buf, '\System32\testordner\datei');
          AssignFile(hFile, string(buf));
          Reset(hFile);
          while not EOF(hFile) do
          begin
            ReadLN(line);  // hier der fehler(denke ich mal)
            MessageBox(0, PChar(line), 'jo', 0);
          end;
        end;

Kernel32.DLL 24. Jun 2004 19:30

Re: Hilfe bei datei auslesen
 
Zitat:

1. if hFile <> INVALID_HANDLE_VALUE then << Das hier funktioniert nicht, "Inkompatible Typen".
Das kann nicht funktionieren, weil TextFile eine Pascal-interne Variable ist. Um INVALID_HANDLE_VALUE benutzen zu können, bedarf es IMHO einem Fensterhandle, dass einen Integerwert hat. Dies bekommt man aber direkt über die Win-API.

Mich würde interessieren, welche Variable du wie deklariert hast. Evtl. liegt der Fehler einfach in einer Vermischung von Pascal- und WinAPI-Variablen.

Luckie 24. Jun 2004 19:34

Re: Hilfe bei datei auslesen
 
Und noch was. Warum ist buf ein PChar, wo du es doch so wie so wieder nach String castest?
Delphi-Quellcode:
lstrcat(buf, '\System32\testordner\datei');
AssignFile(hFile, string(buf));
Hat die Datei keine Dateinamenerweiterung?

Kernel32.DLL 24. Jun 2004 19:43

Re: Hilfe bei datei auslesen
 
@Luckie:
Zitat:

Hat die Datei keine Dateinamenerweiterung?
Zitat:

Die Datei hat zwar nicht die Endung ".txt"(um genau zu sein - sie hat gar keine Endung)...
Bitte sehr, gern geschehen :stupid:

Luckie 24. Jun 2004 19:47

Re: Hilfe bei datei auslesen
 
Aha, man sollte doch immer alles lesen. :roll:

Also, so lange hie rnicht der komplette Quelltext der Routine gepostet wird ist es nur ein Rumgerate.

Nur noch eine Vermutung. machst du vielleicht sowas:
Delphi-Quellcode:
hFile := OpenFile(...);
AssignFile(hFile, ...);
Ich tippe allerdings auch darauf, dass Pascal Routinen mit System Routinen gemischt werde. Was amn nicht machen sollte, aber darauf wird in der Hilfe auch ausdrücklich hingewiesen.

Pseudemys Nelsoni 24. Jun 2004 21:01

Re: Hilfe bei datei auslesen
 
hallo luckie,

Zitat:

Also, so lange hie rnicht der komplette Quelltext der Routine gepostet wird ist es nur ein Rumgerate.
Delphi-Quellcode:
function SetServer(szAddr: PChar): integer;
var
  hFile     : TextFile;
  osvi      : TOSVERSIONINFO;
  buf       : Array[0..255] of char;
  ofs       : TOFSTRUCT;
  lpFileSize : DWORD;
  line      : string;
begin
  result := -1;
  GetWindowsDirectory(@buf[0], SizeOf(Buf));
  ZeroMemory(@osvi, SizeOf(TOSVERSIONINFO));
  osvi.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO);
  if GetVersionEx(osvi) then
  begin
    case osvi.dwPlatformId of
      VER_PLATFORM_WIN32_WINDOWS:
        begin
          // kommt später
        end;
      VER_PLATFORM_WIN32_NT:
        begin
          lstrcat(buf, '\System32\drivers\etc\hosts');
          AssignFile(hFile, string(buf));
          Reset(hFile);
          while not EOF(hFile) do
          begin
            ReadLN(line); // löst den fehler aus
            MessageBox(0, PChar(line), 'blubb', 0);
          end;
        end;
    else
      Exit;
    end;
  end;
end;
die funktion ist natürlich noch nicht fertig, macht aber bereits hier fehler....

nur ka wieso, ich entdecke keinen fehler, und wie gesagt beim ausführen kommt "Runtime Error 6 in..."

Brüggendiek 24. Jun 2004 21:48

Re: Hilfe bei datei auslesen
 
Hallo!

Zitat:

Zitat von Pseudemys Nelsoni
Delphi-Quellcode:
          lstrcat(buf, '\System32\drivers\etc\hosts');

Was ist das denn für ein Dateiname?
[gebetsmühle]
Wo das gesucht wird, hängt davon ab, ob nicht ein anderes Programm den Default-Ordner geändert hat!
[/gebetsmühle]

Gib mal den vollen Pfad an, dann sehen wir weiter. Soll das im Windows-Verzeichnis sein?

Gruß

Dietmar Brüggendiek

Pseudemys Nelsoni 24. Jun 2004 22:46

Re: Hilfe bei datei auslesen
 
hallo Brüggendiek ;),

guck dir mal die funktion "lstrcat"(das pendant zu "Concat()" in delphi) in der winapi hilfe an, dann weiss du warum da ein halber pfad steht.
Denn "buf" enthält bereits die komplette pfadangabe zum Windows ordner.
lstrcat kombiniert diese 2 strings zu einem bzw erweitert den ersten um den zweiten.

Muetze1 25. Jun 2004 01:27

Re: Hilfe bei datei auslesen
 
Moin!

Und könnte es vielleicht sein, das er einen doppelten Backslash da reinbekommt, weil \System32... ja auch noch einen hat am Anfang?

Und nochwas, was auch der Fehler sein kann:

Wenn du ein NTFS Laufwerk hast, dann haben die Dateien unterschiedliche Rechteverteilungen für die einzelnen User/Gruppen. Die hosts in dem Verzeichnis wird auch extra mit solchen Rechten geschützt, und zwar in dem Sinne, das Administratoren und das System vollen Zugriff auf die Datei haben aber normale Benutzer nur Lesezugriff. Da aber die alten File Routinen bei Reset, etc die Dateien immer zum Lesen und Schreiben öffnen, bekommt er da wahrscheinlich ein Problem. Abhilfe schafft hier die Variable FileMode (ich hoffe die gibt es noch, so hiess sie in Pascal) zu ändern. Sie gibt an, welcher Modus beim Reset() etc verwendet wird. IMHO müsstest du eine 1 vor dem Reset() der Variablen zuweisen - ich weiss es aber nicht mehr genau und daher solltest du dich da mal kundig machen bzw. einer hier weiss das.

MfG
Muetze1

Pseudemys Nelsoni 25. Jun 2004 02:10

Re: Hilfe bei datei auslesen
 
hallo Muetze,

danke für deine antwort.

Delphi-Quellcode:
Und könnte es vielleicht sein, das er einen doppelten Backslash da reinbekommt, weil \System32... ja auch noch einen hat am Anfang?
Ne, der api hilfe nach wird zwar mit GetWindowsDirectory der pfad mit "\" am ende ausgegeben, jedoch war da keiner am ende. Der pfad muss auch 100% richtig sein, denn sonst würde ich den runtime error "3" bekommen, nicht "6" :\.

ich werde mal weiter gucken, worans liegt, deine tipps waren jedenfalls schonmal gut.

Nuclear-Ping 25. Jun 2004 08:49

Re: Hilfe bei datei auslesen
 
Wieso sieht das niemand? ;)

Code:
  ...
  AssignFile(hFile, string(buf));
  Reset(hFile);
  while not EOF(hFile) do
    begin
      ReadLN(hFile, line); // sollte das Problem lösen
      MessageBox(0, PChar(line), 'blubb', 0);
    end;
  ...
... bei ReadLn übergibst du ihm doch garkeine Datei, wo er rauslesen soll. Ergo versucht er von StdIn zu lesen, was bei Nicht-Konsolen-Anwendungen scheitert. (imho)

Grüße,
Mario

Muetze1 25. Jun 2004 09:18

Re: Hilfe bei datei auslesen
 
Moin!

Zitat:

Zitat von Nuclear-Ping
Wieso sieht das niemand? ;)

... bei ReadLn übergibst du ihm doch garkeine Datei, wo er rauslesen soll. Ergo versucht er von StdIn zu lesen, was bei Nicht-Konsolen-Anwendungen scheitert. (imho)

Siehst du das denn nicht? ;)

... hFile ist die Datei und die gibt er sehr wohl an bei ReadLn().

@Pseudemys Nelsoni: Hast du auch mal meine 2. Vermutung durchdacht und nicht nur die 1. ??

MfG
Muetze1

Nuclear-Ping 25. Jun 2004 09:45

Re: Hilfe bei datei auslesen
 
Wo gibt er sie an? Bin den Thread grad nochmal durch gegangen und hab überall nur "ReadLN (line);" gesehen. ;)

Muetze1 25. Jun 2004 10:29

Re: Hilfe bei datei auslesen
 
Moin!

Ähm, sorry :wall: . Ich habe den Beitrag anhand deines Code Abschnitt geschrieben - aber naja *hüstel* - der war ja schon von dir angepasst auf den korrekten Code. Ok, ich sollte vielleicht vorher nochmal alles durchgehen... :drunken:

Ergo: Mein Fehler...

MfG
Muetze1

Nuclear-Ping 25. Jun 2004 10:43

Re: Hilfe bei datei auslesen
 
Macht nix. Hätte es auch besser kennzeichnen können. Wollte es eigentlich auch, jedoch hat er keine Bold-Attribs im Code-Tag unterstützt ...

Grüße,
Mario

Kernel32.DLL 25. Jun 2004 11:44

Re: Hilfe bei datei auslesen
 
Arrgh!

Na klar, ReadLN muss natürlich die Datei übergeben werden. :wall:

Mit der Source wär ich früher drauf gekommen :wink:

Pseudemys Nelsoni 25. Jun 2004 14:37

Re: Hilfe bei datei auslesen
 
nun gehts....

DANKE für die antworten :)

komisch das sich das ganze kompilieren liess ohne das ich die datei angegeben hab :\

Muetze1 25. Jun 2004 14:42

Re: Hilfe bei datei auslesen
 
Moin!

Zitat:

Zitat von Pseudemys Nelsoni
komisch das sich das ganze kompilieren liess ohne das ich die datei angegeben hab :\

Ist ganz einfach erklärt: Wenn du die nicht angibst, dann liest ReadLn vom stdin und diese Datei ist nicht offen bei Applikationen, nur bei Konsolenanwendungen werden die std IO Handler initialisiert. Wie in dem anderen Thread gerade gelernt kann ich nun auch sagen das du die Std IO Handler auch mit AllocConsole zur Laufzeit erstellen kannst.

MfG
Muetze1

Pseudemys Nelsoni 25. Jun 2004 15:03

Re: Hilfe bei datei auslesen
 
danke dir :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz