Witam, mam Delphi 7 Enterprise oraz problem z wykonaniem tego gotowca :
http://4programmers.net/Delphi/Gotowce/Prosty_serwerek_FTP_(INDY)
Problem polega na tym, że delphi "nie zna" :
- DirFormat w ADirectoryListing.DirFormat
- DoUnix w ADirectoryListing.DirFormat := doUnix;
- FaHidden i FaSystemFile w SRI := FindFirst(Folder + APath + '*.*', faAnyFile - faHidden - faSysFile, SR);
- ReplaceChars oraz AppDir w LFile := ReplaceChars( AppDir + AFilename );
Komunikaty błędów (mam francuskie delphi):
[Erreur] Unit1.pas(77): Identificateur non déclaré : 'DirFormat'
[Erreur] Unit1.pas(77): Identificateur non déclaré : 'doUnix'
[Avertissement] Unit1.pas(78): Le symbole 'faHidden' est propre a une plate-forme
[Avertissement] Unit1.pas(78): Le symbole 'faSysFile' est propre a une plate-forme
[Erreur] Unit1.pas(131): Identificateur non déclaré : 'ReplaceChars'
[Erreur] Unit1.pas(131): Identificateur non déclaré : 'AppDir'
[Erreur fatale] Project1.dpr(5): Impossible de compiler l'unité utilisée 'Unit1.pas'
Kod źródłowy:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
IdRemoteCMDClient, IdRSH, IdTCPServer, IdFTPServer,IdFTPList;
type
TForm1 = class(TForm)
IdFTPServer1: TIdFTPServer;
procedure IdFTPServer1ListDirectory(ASender: TIdFTPServerThread;
const APath: String; ADirectoryListing: TIdFTPListItems);
procedure IdFTPServer1StoreFile(ASender: TIdFTPServerThread;
const AFileName: String; AAppend: Boolean; var VStream: TStream);
procedure IdFTPServer1RetrieveFile(ASender: TIdFTPServerThread;
const AFileName: String; var VStream: TStream);
procedure IdFTPServer1MakeDirectory(ASender: TIdFTPServerThread;
var VDirectory: String);
procedure IdFTPServer1ChangeDirectory(ASender: TIdFTPServerThread;
var VDirectory: String);
procedure IdFTPServer1GetFileSize(ASender: TIdFTPServerThread;
const AFilename: String; var VFileSize: Int64);
procedure IdFTPServer1DeleteFile(ASender: TIdFTPServerThread;
const APathName: String);
procedure IdFTPServer1UserLogin(ASender: TIdFTPServerThread;
const AUsername, APassword: String; var AAuthenticated: Boolean);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
folder : String;
function ZamienZnaki(APath:String) :String;
var s:String;
begin
s:=StringReplace(APath, '/', '\', [rfReplaceAll]);
s:=StringReplace(s, '\\', '\', [rfReplaceAll]);
Result:=s;
end;
function Rozmiarpliku(AFile : String) : Integer;
var FStream : TFileStream;
begin
try
FStream:=TFileStream.Create(AFile, fmOpenRead);
try
Result:=Fstream.Size;
finally
FreeAndNil(FStream);
end;
except
Result:=0;
end;
end;
procedure TForm1.IdFTPServer1ListDirectory(ASender: TIdFTPServerThread;
const APath: String; ADirectoryListing: TIdFTPListItems);
var
LFTPItem :TIdFTPListItem;
SR : TSearchRec;
SRI : Integer;
begin
ADirectoryListing.DirFormat := doUnix;
SRI := FindFirst(Folder + APath + '\*.*', faAnyFile - faHidden - faSysFile, SR);
While SRI = 0 do
begin
LFTPItem := ADirectoryListing.Add;
LFTPItem.FileName := SR.Name;
LFTPItem.Size := SR.Size;
LFTPItem.ModifiedDate := FileDateToDateTime(SR.Time);
if SR.Attr = faDirectory then
LFTPItem.ItemType := ditDirectory
else
LFTPItem.ItemType := ditFile;
SRI := FindNext(SR);
end;
FindClose(SR);
SetCurrentDir(Folder + APath + '\..');
end;
procedure TForm1.IdFTPServer1StoreFile(ASender: TIdFTPServerThread;
const AFileName: String; AAppend: Boolean; var VStream: TStream);
begin
if not Aappend then
VStream := TFileStream.Create(ZamienZnaki(Folder+AFilename),fmCreate)
else
VStream := TFileStream.Create(ZamienZnaki(Folder+AFilename),fmOpenWrite)
end;
procedure TForm1.IdFTPServer1RetrieveFile(ASender: TIdFTPServerThread;
const AFileName: String; var VStream: TStream);
begin
VStream := TFileStream.Create(ZamienZnaki(Folder+AFilename),fmOpenRead);
end;
procedure TForm1.IdFTPServer1MakeDirectory(ASender: TIdFTPServerThread;
var VDirectory: String);
begin
if not ForceDirectories(ZamienZnaki(Folder + VDirectory)) then
begin
Raise Exception.Create('Nie mozna utworzyc katalogu');
end;
end;
procedure TForm1.IdFTPServer1ChangeDirectory(ASender: TIdFTPServerThread;
var VDirectory: String);
begin
ASender.CurrentDir := VDirectory;
end;
procedure TForm1.IdFTPServer1GetFileSize(ASender: TIdFTPServerThread;
const AFilename: String; var VFileSize: Int64);
Var
LFile : String;
begin
LFile := ReplaceChars( AppDir + AFilename );
try
If FileExists(LFile) then
VFileSize := RozmiarPliku(LFile)
else
VFileSize := 0;
except
VFileSize := 0;
end;
end;
procedure TForm1.IdFTPServer1DeleteFile(ASender: TIdFTPServerThread;
const APathName: String);
begin
DeleteFile(ZamienZnaki(Folder+ASender.CurrentDir+'\'+APathname));
end;
procedure TForm1.IdFTPServer1UserLogin(ASender: TIdFTPServerThread;
const AUsername, APassword: String; var AAuthenticated: Boolean);
begin
if (AUsername='maniek') and (APassword='pankoski') then begin
AAuthenticated := True;
end
else begin
AAuthenticated := False;
end;
end;
end.
Myślę, że główny błąd jest w tym, że u mnie w ADirectoryListing nie ma DirFormat