Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Abfrage (https://www.delphipraxis.net/132254-abfrage.html)

xXxKoGaxXx 8. Apr 2009 19:05


Abfrage
 
Guten Abend,

wollte wissen ob jemand eine Lösung hat:

Ich habe:

Textfeld 1 ist gleich Benutzername.
Textfeld 2 ist gleich Passwort.


Also es die Benutzer stehen auf einem server (nur via ftp zugänglich im netzwerk)

Name der Datei: tester.txt // tester ist der Benutzername -> Edit1.text
Inhalt ist: test // test ist das Passwort -> Edit2.text


Meine Frage ist nun wie ich erst überprüfen lassen kann ob die datei tester (Der Benutzer, also Edit1.text) exestiert und dann das Passwort überprüfen lassen kann (Edit2.text, also Inhalt der Datei tester.txt).

Vielen Dank in vorraus,
:wall: KoGa :wall:

jaenicke 8. Apr 2009 19:10

Re: Abfrage
 
Und was ist jetzt dein Problem?
Der Zugriff via FTP? --> TIdFTP
Das Auslesen der Datei? --> TStringList
Das Vergleichen des Inhaltes?
...

Cyf 8. Apr 2009 19:11

Re: Abfrage
 
Außer dass das nach einer Datenbank schreit und irgendwie unsicher klingt.

Delphi-Quellcode:
function FileExists(const FileName: string): Boolean;
und halt den Inhalt der Textdatei auf Gleichheit prüfen.

[Edit]Achnee, soll ja auf einem FTP-Server sein, muss man aber auch erstmal rauslesen.
Aber dir ist schon klar, dass man die Abfrage in deinem Programm recht leicht umbiegen kann?

xXxKoGaxXx 8. Apr 2009 19:15

Re: Abfrage
 
Also die Datei Via Ftp zu bekommen ist kein Problem, meinProblem ist eben den Inhalt zu vergleichen ohne die Datei zu downloaden.
Soll eben erst Benutzer (datei, sprich ist der dateiname),
wenn falsch dann Fehler meldung,
wenn richtig dann weiter,
passwort (inhalt der datei),
falsch dann fehler meldung,
wenn richtig dann weiter...

:wall:

[Edit] ist nur fürs Netzwerk, ist ja nix wichtiges :) [/Edit]

mkinzler 8. Apr 2009 19:17

Re: Abfrage
 
Hole dir den Verzeichnisinhalt und gehe dann dier Liste durch

xXxKoGaxXx 8. Apr 2009 19:30

Re: Abfrage
 
Ne, ich brauch ein Programm was das erledigt ^^

mkinzler 8. Apr 2009 19:32

Re: Abfrage
 
Dann schreib dir eines oder soll das hier ein Jobangebot sein?

xXxKoGaxXx 8. Apr 2009 19:34

Re: Abfrage
 
Wenn ich es net hinbekomme und wissen möchte wie ich eine Datei OHNE download auslesen lassen kann bzw vergleichen kann mit einem textfeld ...

DeddyH 8. Apr 2009 19:36

Re: Abfrage
 
Die Datei liegt auf einem FTP-Server und Du willst die ohne Download auslesen? Wenn Du das schaffst, wäre ich am Quellcode interessiert :mrgreen:

mkinzler 8. Apr 2009 19:37

Re: Abfrage
 
Den Inhalt kannst du ohne Download nicht einsehen. Für den dateinamen sollte es reichen dir eine Dateiliste vom FTP-Server zu holen

xXxKoGaxXx 8. Apr 2009 19:38

Re: Abfrage
 
ups, also ohne download meinte ich das die datei nicht zu finden ist dann aufm dem computer ...

jaenicke 8. Apr 2009 19:38

Re: Abfrage
 
Du musst die Datei herunterladen, sonst kannst du nicht deren Inhalt nutzen. Via FTP kann man die Datei AFAIK nicht nur im Arbeitsspeicher benutzen, sondern muss diese wirklich herunterladen. Das kann aber ja im Verzeichnis für temporäre Dateien passieren und die kann ja sofort wieder gelöscht werden.

mkinzler 8. Apr 2009 19:39

Re: Abfrage
 
Zitat:

Zitat von xXxKoGaxXx
ups, also ohne download meinte ich das die datei nicht zu finden ist dann aufm dem computer ...

? :gruebel:

Cyf 8. Apr 2009 19:40

Re: Abfrage
 
Dann lad sie in den RAM? Wobei man sie auch dort auslesen kann.

xXxKoGaxXx 8. Apr 2009 19:41

Re: Abfrage
 
kann mir wer ein code beispiel zeigen?
bitte

mkinzler 8. Apr 2009 19:43

Re: Abfrage
 
Für FTP oder das laden in einen MemoryStream?

jaenicke 8. Apr 2009 19:44

Re: Abfrage
 
Also ich kenne keine FTP-Funktion um eine Datei ohne Zwischenspeicherung auszulesen, weder bei Indy noch per API. Man könnte höchstens den Befehl selbst schicken und dann das Ergebnis selbst auswerten. Aber FtpGetFile usw. können eine Datei nur lokal speichern.

Am besten nimm Indy und TIdFTP, lade die Datei ins Verzeichnis für temporäre Dateien, werte sie aus und lösche sie sofort wieder. Die Auswertung geht schnell und sicher ist das Verfahren ja ohnehin nicht, deshalb ist das ja egal, dass die Datei kurz dort zu finden ist.

xXxKoGaxXx 8. Apr 2009 19:47

Re: Abfrage
 
Was ich schon hab ist eben das:

Delphi-Quellcode:
function getfile(server, username, password, localfile, remotefile: string; port: word = 21): boolean;
var
  hopen, hconnect: HINTERNET;
begin
  hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  hconnect := InternetConnect(hopen, pchar(server), port, pchar(username), pchar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
  Result := FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, 0, FTP_TRANSFER_TYPE_UNKNOWN, 0);
  InternetCloseHandle(hconnect);
end;
und jetzt möcht ich das überprüfen lassen wie ich es schonmal geschieben hab und die datei mit dem passwort kann gedownloadet werden, sollte aber wieder direkt gelöscht werden. Wie gesagt es ist nur im netzwerk ...

jaenicke 8. Apr 2009 19:51

Re: Abfrage
 
So machst du es dir unnötig schwer, denn Indy und TIdFTP ist da sehr viel einfacher. Aber gut.

Der Rückgabewert sollte dir anzeigen, ob die Datei erfolgreich gefunden und heruntergeladen werden konnte. Wenn ja, dann kannst du jetzt die lokale Datei öffnen und auslesen:
Delphi-Quellcode:
var
  MyFile: TStringList;
  PasswordMatches: Boolean;
begin
  MyFile := TStringList.Create;
  try
    MyFile.LoadFromFile(YourFileName);
    PasswordMatches := Trim(MyFile.Text) = YourPassword;
  finally
    MyFile.Free;
  end;
end;
Wobei YourPassword das zu prüfende Passwort, YourFileName die lokale heruntergeladene Datei und PasswordMatches die Variable für das Ergebnis des Passwortvergleichs ist.

mkinzler 8. Apr 2009 19:55

Re: Abfrage
 
Wobei du die Datei mit idFtp.Get() gleich in einen MemoryStream laden kannst und so keine lokale datei geschriben wird.

jaenicke 8. Apr 2009 20:40

Re: Abfrage
 
Stimmt, da war ich irgendwie blind, ich hatte genau danach geschaut und das nicht gefunden. :gruebel:
Delphi-Quellcode:
procedure TIdFTP.Get(const ASourceFile: string; ADest: TStream; AResume: Boolean = False);

xXxKoGaxXx 8. Apr 2009 21:49

Re: Abfrage
 
Ich versteh die Welt nicht mehr ...

Hier Mein Code...

Delphi-Quellcode:
unit Chat1;

interface

uses
  Windows, WinInet, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, StdCtrls, Login;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Frame11: TFrame1;
    procedure Button1Click(Sender: TObject);
    procedure Frame11CancelBtnClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function putfile(server, username, password, localfile, remotefile: string; port: word = 21): boolean;
var
hopen, hconnect: HINTERNET;
begin
hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
hconnect := InternetConnect(hopen, pchar(server), port, pchar(username), pchar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
Result := FtpPutFile(hconnect, pchar(localfile), pchar(remotefile), FTP_TRANSFER_TYPE_UNKNOWN, 0);
InternetCloseHandle(hconnect);
end;

function getfile(server, username, password, localfile, remotefile: string; port: word = 21): boolean;
var
  hopen, hconnect: HINTERNET;
begin
  hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  hconnect := InternetConnect(hopen, pchar(server), port, pchar(username), pchar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
  Result := FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, 0, FTP_TRANSFER_TYPE_UNKNOWN, 0);
  InternetCloseHandle(hconnect);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Frame11.Show;
  Button1.Hide;
end;

procedure TForm1.Frame11CancelBtnClick(Sender: TObject);
begin
  ShowMessage('...wird beendet.');
  close;
end;

end.
und

Delphi-Quellcode:
unit Login;

interface

uses
  Windows, WinInet, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFrame1 = class(TFrame)
    Label1: TLabel;
    Password: TEdit;
    OKBtn: TButton;
    CancelBtn: TButton;
    Label2: TLabel;
    Edit1: TEdit;
    procedure OKBtnClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

implementation

{$R *.dfm}

function putfile(server, username, password, localfile, remotefile: string; port: word = 21): boolean;
var
hopen, hconnect: HINTERNET;
begin
hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
hconnect := InternetConnect(hopen, pchar(server), port, pchar(username), pchar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
Result := FtpPutFile(hconnect, pchar(localfile), pchar(remotefile), FTP_TRANSFER_TYPE_UNKNOWN, 0);
InternetCloseHandle(hconnect);
end;

function getfile(server, username, password, localfile, remotefile: string; port: word = 21): boolean;
var
  hopen, hconnect: HINTERNET;
begin
  hopen := InternetOpen('myagent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  hconnect := InternetConnect(hopen, pchar(server), port, pchar(username), pchar(password), INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
  Result := FtpGetFile(hconnect, pchar(localfile), pchar(remotefile), false, 0, FTP_TRANSFER_TYPE_UNKNOWN, 0);
  InternetCloseHandle(hconnect);
end;

procedure TFrame1.OKBtnClick(Sender: TObject);

var
Datei: TextFile;
  MyFile: TStringList;
  PasswordMatches: Boolean;

begin
getfile('ip', 'benutzer', 'pw', 'verzeichniss' + Edit1.Text + '.txt', Edit1.Text + '.txt');
  MyFile := TStringList.Create;
  try
    MyFile.LoadFromFile(Edit1.text + '.txt');
    PasswordMatches := Trim(MyFile.text) = 'Edit2.text';
  finally
    MyFile.Free;
  end;
end;


end.

jaenicke 8. Apr 2009 22:01

Re: Abfrage
 
Du ignorierst den Rückgabewert von getfile...
Delphi-Quellcode:
if getfile(...) then
...
Aber ich lese da gerade "unit Chat1"?!? Willst du so einen Chat machen? :pale: :shock: Das ist hoffentlich nicht dein Ernst...

Jedenfalls würdest du dir das Leben wie gesagt leichter machen, wenn du einfach die Indy Komponenten und TIdFtp benutzen würdest. Dann brauchst du dich nicht mit den komplizierteren Befehlen InternetOpen, FtpGetFile, ... herumschlagen, die du im Moment kopiert hast benutzt...

xXxKoGaxXx 8. Apr 2009 22:50

Re: Abfrage
 
Nein, es soll kein Chat sein. Es soll mehr eine art wie soll ich es nennen...zwischenspeicher sein.

Danke fürn Befehl:


[quote="jaenicke"]
Delphi-Quellcode:
if getfile(...) then
...

Wer morgen mal weiter probieren...
gn8


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:50 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