Wysyłanie plików z różnych komputerów do różnych folderów na FTP

0

Witam. (nie umiem za bardzo programowac, więc proszę o pomoc)

Uzywam Indy do wysylania pliku FTP na serwer... lecz te same pliki beda
wysylane np z kilku komputerow, chcialbym napisac coś takiego aby pliki z
kazdego komputera wysylaly sie w inny folder....

Jak zrobić by pliki się wysylaly do folderu, ktory automatycznie sie utworzy w przypadku jego braku o nazwie NAZWAUŻYTKOWNIKA_NAZWAKOMPUTERA

kod indy jaki mam jest taki... co tu dodac / zmienic by sie tworzyly takie foldery?

procedure TForm1.Button1Click(Sender: TObject);
begin
  idFTP1.Host := 'ftp.serwer.pl';
  idFTP1.Username := 'mojlogin';
  idFTP1.Password := 'haslo';
  IdFTP1.Port:= 21;
  idFTP1.Connect();
  idFTP1.Put ('c:\1.log','1.log');
  idFTP1.Disconnect();
end;

dodanie znacznika <cod=edelphi> i sformatowanie treści posta - fp

0

Można np. tak:

 
procedure TForm1.Button1Click(Sender: TObject);
var csv,dirList : TStrings;
    buffer: array[0..255] of char;
    BufferSize : DWord;
    ComputerName : string;
    UserName : string;
    i : integer;
begin
    try
        csv:=TStringList.Create;
        dirList:=TStringList.Create;
        csv.Delimiter:=';';
        csv.StrictDelimiter:=TRUE;
        Memo1.Lines.Clear;
        BufferSize:=256;
        if GetComputerName(buffer, BufferSize) then begin
            ComputerName:= buffer;
        end else begin
            ComputerName:='BrakNazwyHosta';
        end;
        BufferSize:=255;
        SetLength(UserName,BufferSize) ;
        if GetUserName(PChar(UserName), BufferSize) then begin
            UserName := Copy(UserName,1,BufferSize - 1)
        end else begin
            UserName := 'BrakNazwyUzytkownika';
        end;
        Memo1.Lines.Append('ComputerName: '+ComputerName);
        Memo1.Lines.Append('UserName: '+UserName);
        //----------------
        idFTP1.Host := '->host<-';
        idFTP1.Username := '->user<-';
        idFTP1.Password := '->pass<-';
        IdFTP1.Port:= 21;
        idFTP1.Connect();
        //----------------
        //--Pobieranie listy katalogów
        idFTP1.ChangeDir('.');
        Memo1.Lines.Append('Aktualny katalog: '+idFTP1.RetrieveCurrentDir);
        idFTP1.List;
        dirList.Clear;
        for i:=0 to idFTP1.ListResult.Count-1 do begin
            csv.DelimitedText:=idFTP1.ListResult.Strings[i];
            dirList.Append(Trim(csv.Strings[7]));
        end;
        Memo1.Lines.Append(dirList.Text);
        //----------------
        //--Sprawdzanie, czy wskazany katalog jest na liście
        if dirlist.IndexOf(ComputerName+'_'+UserName)<0 then begin
            Memo1.Lines.Append('Tworzenie katalogu: '+idFTP1.RetrieveCurrentDir+ComputerName+'_'+UserName);
            idFTP1.MakeDir(ComputerName+'_'+UserName);
        end;
        idFTP1.Disconnect();
    finally
        if Assigned(csv) then begin
            FreeAndNil(csv);
        end;
        if Assigned(dirList) then begin
            FreeAndNil(dirList);
        end;
    end;
end;

Oczywiście można ten kod uprościć, elementy wyciągające nazwę komputera i użytkownika wyrzucić do osobnych funkcji. Nie tworzyć pierdyliona zmiennych, ale chodziło mi o pokazanie sensu w "zwartej" konstrukcji. Pasuje też całość opakować w try ... except ... end;

Dla ciebie najważniejszy jest moment, po sprawdzeniu czy poszukiwany katalog znajduje się w bieżącej ścieżce.

0

na moje amatorskie oko ten kod jest trudny do zrozumienia...
z pomocą googli itd stworzylem prosty kod, ktory tworzy nazwe folderu wg daty/czasu....byly tam potrzebne tylko kilka linijek by to zrobic :D a tu widze troche duzo tego by dopisac nazwe uzytkownika / komputera

moj kod wygląda obecnie następująco:

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdFTP, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    IdFTP1: TIdFTP;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;    CurrData: String;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
    begin
    CurrData := '';
    idFTP1.Host := 'ftp.domena.pl';
    idFTP1.Username := 'login';
    idFTP1.Password := 'haslo';
    IdFTP1.Port:= 21;
    idFTP1.Connect();
    CurrData := FormatDateTime('dddd_mm_yyyy_hh_nn_ss', Now);
    IdFTP1.MakeDir(CurrData);
    IdFTP1.ChangeDir(CurrData);
    idFTP1.Put ('c:\1.log','1.log');
    idFTP1.Disconnect();
    end;
end;
end.

wszystko jest okej , ale bylbym wdziewczny jeszcze za pomoc by w nazwie
folderu ktory sie tworzy, dodatkowo sie tworzyla nazwa uzytkownika...by
nazwa folderu miala następującą nazwę - LOGINUZYTKOWNIKA_DATA

0

No cóż. Skoro zmieniasz założenia i nie analizujesz kodu, który jest ci podawany na tacy, to sorry. Ciężko będzie ci pomóc.

Odpowiadając na drugą część twojego pytania - po przeanalizowaniu mojego kodu i połączeniu ze swoim - dostaniesz efekt, o który ci chodzi.

P.S. W tej chwili ten "prosty" kod, który pokazałeś ma szansę zazwyczaj działać. Do czasu, aż jednocześnie dwóch użytkowników spróbuje wykonać operacje założenia katalogu dokładnie w tym samym czasie - będzie łoooops.

0

ok, polaczylem 2 kody w jeden i dziala ;)
nie mniej jednak chcialbym wiedziec, dlaczego te elementy które ominąłem ? są / nie są wązne? bo wlasciwie wszystko co pominalem, nie rozumiem "co robi" tak wlasciwie..
tak wyglada teraz moj kod:

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdFTP, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    IdFTP1: TIdFTP;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;    CurrData: String;
  buffer: array[0..255] of char;
  BufferSize : DWord;
  ComputerName : string;
  UserName : string;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
    begin
        BufferSize:=256;
        if GetComputerName(buffer, BufferSize) then begin
            ComputerName:= buffer;
        end else begin
            ComputerName:='BrakNazwyHosta';
        end;
       BufferSize:=255;
        SetLength(UserName,BufferSize) ;
        if GetUserName(PChar(UserName), BufferSize) then begin
            UserName := Copy(UserName,1,BufferSize - 1)
        end else begin
            UserName := 'BrakNazwyUzytkownika';
        end;
    CurrData := '';
    idFTP1.Host := 'ftp.mojadomena.pl';
    idFTP1.Username := 'login';
    idFTP1.Password := 'haslo';
    IdFTP1.Port:= 21;
    idFTP1.Connect();
    CurrData := FormatDateTime('dddd-mm-yyyy_hh_nn_ss', Now);
    IdFTP1.MakeDir(UserName+'_'+'_'+ComputerName+'_'+CurrData);
    IdFTP1.ChangeDir(UserName+'_'+'_'+ComputerName+'_'+CurrData);
    idFTP1.Put ('c:\1.log','1.log');
    idFTP1.Disconnect();
    end;
end;
end.
1

Te elementy, które ominąłeś służą do sprawdzenia czy interesujący cię katalog istnieje na serwerze FTP.

Omijając je zakładasz, że katalog nie istnieje i zawsze go zakładasz.

Oczywiście wszystko kwestia czego potrzebujesz - jeżeli twoim celem jest przechowywanie logu z każdego komputera w niezależnych katalogach osobno - w porządku. Ale jeżeli chcesz w jakiś zautomatyzowany sposób przetwarzać dalej te logi - wiele katalogów z jednym plikiem może wprowadzać pewne zamieszanie/utrudnienie.

Być może lepszym rozwiązaniem byłoby stworzenie jednego katalogu wspólnego na logi, a tylko nazwy plików logów tworzyć dynamicznie - po prostu zamiast tworzyć katalog z nazwą <data><KOMPUTER><USER> - "putnąć" plik <DATA><KOMPUTER><USER>.log - takie rozwiązanie wydaje się być bardziej ... uporządkowane.

1 użytkowników online, w tym zalogowanych: 0, gości: 1