Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi FTP upload ohne INDY ! Kann mir jemand das erklären ? (https://www.delphipraxis.net/79018-ftp-upload-ohne-indy-kann-mir-jemand-das-erklaeren.html)

eLse-maestro 14. Okt 2006 22:34


FTP upload ohne INDY ! Kann mir jemand das erklären ?
 
hey,
ich bin ganz neu in Delphi, & ich wollte ein programm machen das eine ganzen Ordner hochläd (inklusive inhalt ;) ) oder das es nur den Inhalt hochlädt dann aber noch einen Ordner erstellt..
Ich habe mich hier im forum schon umgeschaut .. & hier im forum bin ich dann irgendwie auf die seite gekommen :
Webseiten-Titel
hmm kapieren tu ich das nicht :D kann mir jemand einen anderen quellcode geben (der auch ganze ordner/inhalte) hochlädt ? & eklären ? dankeschön

Achja & ganz neben bei noch eine frage, ich hatte mal ein programm wo immer ein neuer text drin stand, dh. er wurde immer übers internet aktualiesiert also einer hat den geschrieben & in meinem programm stand der dann .. kann mir jemand sagen wie das geht ? oder wie ich befehle senden kann ?

PS:
Dieses Indy habe ich installiert .. aber ich kann es irgendwie nicht benutzen da kommt immer so ein fehler .. das & das nicht gefunden oder so .. bei uses glaub ich ..

naja danke euch allen die antworten

MFG
eLse

inherited 14. Okt 2006 23:13

Re: FTP upload ohne INDY ! Kann mir jemand das erklären ?
 
Das mit den Uses kommt, wenn du die Bibliothekspfade nicht oder falsch setzt
auf www.indyproject.org glaub ich gibt es auch einen installer der das alles fuer dich uebernimmt.
Ein solches Programm wie du es grad beschrieben hast habe ich mal geschrieben. BEi interessepn an mich

eLse-maestro 16. Okt 2006 17:46

Re: FTP upload ohne INDY ! Kann mir jemand das erklären ?
 
Soo ich weiß in der überschrift steht ohne INDY ^^ .. wenn ihr wollt mache ich ein neues Thema auf ..
auf der INDY seite kann man ja automatische installation machen .. dann drücke ich auf download & dann komme ich auf sone komische seite wo ich gar net weiß wo der download ist .. kann mir da jmd helfen ? oder einen direkt link posten?
hier wo der download steht (indy 10): indy 10
& das wenn ich auf automatik install drück : automatic
Ich habe auch schon manuell versucht zu installieren .. die icons oben in delphi werden angezeigt aber der findet manche uses plugins da net .. wie schon gesagt.

danke

PS:
ich benutze borland delphi 7 PERSONAL
falls euch weiter hilft :D

[edit]:
PPS:
@ inherited kannste mir das prog mal schicken ? oder den quellcode .. oder am besten die units & so ?? ^^ danke

shmia 16. Okt 2006 17:53

Re: FTP upload ohne INDY ! Kann mir jemand das erklären ?
 
Zitat:

Zitat von eLse-maestro
ich bin ganz neu in Delphi, & ich wollte ein programm machen das eine ganzen Ordner hochläd (inklusive inhalt ;) )

Sorry, dann würde ich aber an deiner Stelle mit etwas einfacheren Projekten beginnen.
Es bringt ja nix, wenn das Projekt zwar interessant ist, dir aber 95% an Know How für diese Projekt fehlt.
Wenn du's trotzdem nicht lassen möchtest; hier gibt's (fast) alles schon fix & fertig:
http://www.delphipraxis.net/internal...ct.php?t=53643

eLse-maestro 18. Okt 2006 14:39

Re: FTP upload ohne INDY ! Kann mir jemand das erklären ?
 
Danke euch .. aber ich habe auch bei den links nichts passendes gefunden .. ich bin hier in dem forum mal auf den code gestoßen
Delphi-Quellcode:
uses
  WinInet

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;
Delphi-Quellcode:
putfile('154.26.23.142', 'user5', 'password', 'C:\foobar.txt', '/html/foobar.txt')
Kann man da nicht einfach noch einbauen das man einen GANZEN ordner hochlädt bzw. den inhalt des ordners? Oder kann mir jemand eine liste geben wie das alles geht mit orner unbennen & so ?
aber wichtig ist das erstmal mit den ordner !
in batch ging das so weit ich weiß mit *.*
hat jemand eine ahnung ?
freue mich auf jede antwort !

mfG
else

hsbc 18. Okt 2006 14:43

Re: FTP upload ohne INDY ! Kann mir jemand das erklären ?
 
Hallo,

Anweisung für einen ganzen Ordner hochladen gibt es nicht. Du musst einfach in einer Schleife jede einzelne Datei deines Ordners hochladen.

mfg
Herbert

eLse-maestro 18. Okt 2006 15:14

Re: FTP upload ohne INDY ! Kann mir jemand das erklären ?
 
hmm ok .. aber ich weiß ja gar nicht wie die alle heißen die dateien .. kannst du mir villeicht eine schleife sagen womit ich alle vorhandenen dateien im ordner hochladen kann ?
danke

Klaus01 18. Okt 2006 15:17

Re: FTP upload ohne INDY ! Kann mir jemand das erklären ?
 
Such einmal hier im Forum nach FindFirst und FindNext.
Die Ergebnisse sollten Dich einer Lösung näher bringen.

Grüße
Klaus

ErazerZ 18. Okt 2006 16:19

Re: FTP upload ohne INDY ! Kann mir jemand das erklären ?
 
hey
ich hab diese funktion grad für dich gemacht, ist nicht ganz fertig, ich ändere es später wieder wenn ich wieder komme (falls ich fehler finde), ich muss jetzt wieder los


Edit:
Code geändert und getestet, alles funktioniert wunderbar :)

Delphi-Quellcode:
function UploadFolder(lpszServer, lpszUsername, lpszPassword, lpszLocalDirectory, lpszRemoteDirectory: String; wPort: Word = 21): Boolean;
const
  sErrorDirectoryUpload = 'Das Verzeichnis "%s" konnte nicht auf den Server geladen werden!';
  sErrorDirectoryCreate = 'Das Verzeichnis "%s" konnte nicht auf dem Server erstellt werden!';
  sErrorDirectorySet   = 'Es konnte nicht in das Verzeichnis "%s" gewechselt werden!';
  sErrorFileCreate     = 'Datei "%s%s" konnte nicht erstellt werden!';
var
  hOpen, hConnect: HINTERNET;
  function UploadDirectory(lpszPath, lpszRemote: String): Boolean;
  var
    lpFindFileData: TWIN32FindData;
    hFindFile: THandle;
    szLastDirectory: String;
  begin
    Result := False;
    lpszPath := IncludeTrailingPathDelimiter(lpszPath);
    // wir brauchen hier den Namen vom letzten Verzeichnis, also den den wir gerade durchsuchen, um dann FtpSetCurrentDIrectory
    // aufzurufen.
    lpszRemote := ExcludeTrailingPathDelimiter(lpszRemote);
    if LastDelimiter('\', lpszRemote) > 0 then
      szLastDirectory := Copy(lpszRemote, LastDelimiter('\', lpszRemote) +1, Length(lpszRemote))
    else
    if LastDelimiter('/', lpszRemote) > 0 then
      szLastDirectory := Copy(lpszRemote, LastDelimiter('/', lpszRemote) +1, Length(lpszRemote))
    else
      szLastDirectory := lpszRemote;
    lpszRemote := IncludeTrailingPathDelimiter(lpszRemote);

    if not FtpCreateDirectory(hConnect, PChar(szLastDirectory)) then
    begin
      // Verzeichnis konnte nicht erstellt werden, versuche noch in das Verzeichnis zu wechseln
      if not FtpSetCurrentDirectory(hConnect, PChar(szLastDirectory)) then
      begin
        MessageBox(HWND_DESKTOP, PChar(Format(sErrorDirectoryCreate, [szLastDirectory])), 'Error', MB_ICONERROR);
        Exit;
      end;
    end else
    begin
      // Verzeichnis setzen, in dem wir Arbeiten
      if not FtpSetCurrentDirectory(hConnect, PChar(szLastDirectory)) then
      begin
        MessageBox(HWND_DESKTOP, PChar(Format(sErrorDirectorySet, [szLastDirectory])), 'Error', MB_ICONERROR);
        Exit;
      end;
    end;
    // Prüfen ob das Verzeichnis auf dem lokalen PC existiert.
    if DirectoryExists(lpszPath) then
    begin
      hFindFile := FindFirstFile(PChar(lpszPath + '*.*'), lpFindFileData);
      if (hFindFile <> INVALID_HANDLE_VALUE) then
      begin
        repeat
          if ((String(lpFindFileData.cFileName) = '.') or (String(lpFindFileData.cFileName) = '..')) then
            continue;
          // Dateien vom Verzeichnis uploaden ...
          if (lpFindFileData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0) then
          begin
             if not FtpPutFile(hConnect,
                               PChar(Format('%s%s', [lpszPath, lpFindFileData.cFileName])),
                               PChar(Format('%s', [lpFindFileData.cFileName])), FTP_TRANSFER_TYPE_UNKNOWN, 0) then
            begin
              // Datei konnte nicht erstellt werden!
              MessageBox(HWND_DESKTOP, PChar(Format(sErrorFileCreate, [lpszRemote, lpFindFileData.cFileName])), 'Error', MB_ICONERROR);
              Windows.FindClose(hFindFile);
              Exit;
            end;
          end else
          // Ein Verzeichnis wurde gefunden also in das Verzeichnis wechseln und dort die Dateien suchen und die dann uploaden ..
          begin
            if not UploadDirectory(Format('%s%s', [lpszPath, lpFindFileData.cFileName]),
                                   Format('%s%s', [lpszRemote, lpFindFileData.cFileName])) then
            begin
              MessageBox(HWND_DESKTOP, PChar(Format(sErrorDirectoryUpload, [lpszPath])), 'Error', MB_ICONERROR);
              Exit;
            end;
          end;
        until not (FindNextFile(hFindFile, lpFindFileData));
        Windows.FindClose(hFindFile);
        // cd ..
        if not FtpSetCurrentDirectory(hConnect, '..') then
        begin
          MessageBox(HWND_DESKTOP, PChar(Format(sErrorDirectorySet, ['..'])), 'Error', MB_ICONERROR);
          Exit;
        end;
        Result := True;
      end;
    end;
  end;
begin
  Result := False;
  hOpen := InternetOpen('MyAgent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  if (hOpen <> nil) then
  begin
    hConnect := InternetConnect(hOpen, PChar(lpszServer), wPort, PChar(lpszUsername), PChar(lpszPassword),
                                INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
    if (hConnect <> nil) then
    begin
      Result := UploadDirectory(lpszLocalDirectory, lpszRemoteDirectory);
      InternetCloseHandle(hConnect);
      InternetCloseHandle(hOpen);
    end;
  end;
end;
Beispiel aufruf:
Delphi-Quellcode:
  if UploadFolder('meinserver.de', 'admin', 'r00t', 'c:\tmp', 'etc') then
    showmessage('Verzeichnis wurde auf den server geuppt!');

eLse-maestro 19. Okt 2006 21:10

Re: FTP upload ohne INDY ! Kann mir jemand das erklären ?
 
Ja danke für den code ! Respekt .. aber bei mir läufts nicht :( also code funzt aber der uppt nicht .. wass soll ich den bei "etc" reiin schreiben ich habe das einfach so genannt wie mein ordner .. aber der uppt NULL ;) danke trotzdem

ErazerZ 20. Okt 2006 12:47

Re: FTP upload ohne INDY ! Kann mir jemand das erklären ?
 
hey!
ich habe den code einwenig umgeändert damit man auch in das homeverzeichnis uploaden kann und man kann angeben ob man subfolders uploaden will
Delphi-Quellcode:
function UploadFolder(lpszServer, lpszUsername, lpszPassword, lpszLocalDirectory, lpszRemoteDirectory: String; UploadSubFolders: Boolean = True; wPort: Word = 21): Boolean;
const
  sErrorDirectoryUpload = 'Das Verzeichnis "%s" konnte nicht auf den Server geladen werden!';
  sErrorDirectoryCreate = 'Das Verzeichnis "%s" konnte nicht auf dem Server erstellt werden!';
  sErrorDirectorySet   = 'Es konnte nicht in das Verzeichnis "%s" gewechselt werden!';
  sErrorFileCreate     = 'Datei "%s%s" konnte nicht erstellt werden!';
var
  hOpen, hConnect: HINTERNET;
  function UploadDirectory(lpszPath, lpszRemote: String): Boolean;
  var
    lpFindFileData: TWIN32FindData;
    hFindFile: THandle;
    szLastDirectory: String;
  begin
    Result := False;
    lpszPath := IncludeTrailingPathDelimiter(lpszPath);
    // wir brauchen hier den Namen vom letzten Verzeichnis, also den den wir gerade durchsuchen, um dann FtpSetCurrentDIrectory
    // aufzurufen.
    lpszRemote := ExcludeTrailingPathDelimiter(lpszRemote);
    if LastDelimiter('\', lpszRemote) > 0 then
      szLastDirectory := Copy(lpszRemote, LastDelimiter('\', lpszRemote) +1, Length(lpszRemote))
    else
    if LastDelimiter('/', lpszRemote) > 0 then
      szLastDirectory := Copy(lpszRemote, LastDelimiter('/', lpszRemote) +1, Length(lpszRemote))
    else
      szLastDirectory := lpszRemote;
    lpszRemote := IncludeTrailingPathDelimiter(lpszRemote);

    if (szLastDirectory <> '') then
    begin
      if not FtpCreateDirectory(hConnect, PChar(szLastDirectory)) then
      begin
        // Verzeichnis konnte nicht erstellt werden, versuche noch in das Verzeichnis zu wechseln
        if not FtpSetCurrentDirectory(hConnect, PChar(szLastDirectory)) then
        begin
          MessageBox(HWND_DESKTOP, PChar(Format(sErrorDirectoryCreate, [szLastDirectory])), 'Error', MB_ICONERROR);
          Exit;
        end;
      end else
      begin
        // Verzeichnis setzen, in dem wir Arbeiten
        if not FtpSetCurrentDirectory(hConnect, PChar(szLastDirectory)) then
        begin
          MessageBox(HWND_DESKTOP, PChar(Format(sErrorDirectorySet, [szLastDirectory])), 'Error', MB_ICONERROR);
          Exit;
        end;
      end;
    end;

    // Prüfen ob das Verzeichnis auf dem lokalen PC existiert.
    if DirectoryExists(lpszPath) then
    begin
      hFindFile := FindFirstFile(PChar(lpszPath + '*.*'), lpFindFileData);
      if (hFindFile <> INVALID_HANDLE_VALUE) then
      begin
        repeat
          if ((String(lpFindFileData.cFileName) = '.') or (String(lpFindFileData.cFileName) = '..')) then
            continue;
          // Dateien vom Verzeichnis uploaden ...
          if (lpFindFileData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0) then
          begin
             if not FtpPutFile(hConnect,
                               PChar(Format('%s%s', [lpszPath, lpFindFileData.cFileName])),
                               PChar(Format('%s', [lpFindFileData.cFileName])), FTP_TRANSFER_TYPE_UNKNOWN, 0) then
            begin
              // Datei konnte nicht erstellt werden!
              MessageBox(HWND_DESKTOP, PChar(Format(sErrorFileCreate, [lpszRemote, lpFindFileData.cFileName])), 'Error', MB_ICONERROR);
              Windows.FindClose(hFindFile);
              Exit;
            end;
          end else
          // Ein Verzeichnis wurde gefunden also in das Verzeichnis wechseln und dort die Dateien suchen und die dann uploaden ..
          begin
            if UploadSubFolders then
            begin
              if not UploadDirectory(Format('%s%s', [lpszPath, lpFindFileData.cFileName]),
                                     Format('%s%s', [lpszRemote, lpFindFileData.cFileName])) then
              begin
                MessageBox(HWND_DESKTOP, PChar(Format(sErrorDirectoryUpload, [lpszPath])), 'Error', MB_ICONERROR);
                Exit;
              end;
            end;
          end;
        until not (FindNextFile(hFindFile, lpFindFileData));
        Windows.FindClose(hFindFile);
        if (szLastDirectory <> '') then
        begin
          // cd ..
          if not FtpSetCurrentDirectory(hConnect, '..') then
          begin
            MessageBox(HWND_DESKTOP, PChar(Format(sErrorDirectorySet, ['..'])), 'Error', MB_ICONERROR);
            Exit;
          end;
        end;
        Result := True;
      end;
    end;
  end;
begin
  Result := False;
  hOpen := InternetOpen('MyAgent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  if (hOpen <> nil) then
  begin
    hConnect := InternetConnect(hOpen, PChar(lpszServer), wPort, PChar(lpszUsername), PChar(lpszPassword),
                                INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
    if (hConnect <> nil) then
    begin
      Result := UploadDirectory(lpszLocalDirectory, lpszRemoteDirectory);
      InternetCloseHandle(hConnect);
      InternetCloseHandle(hOpen);
    end;
  end;
end;
Hier ist die erklärung:
Delphi-Quellcode:
function UploadFolder(
lpszServer,                      // Server Adresse, z.b. xyz.meineseite.de
lpszUsername,                    // Username ..
lpszPassword,                    // Password ..
lpszLocalDirectory,              // Lokaler Ordner, also der der raufgeladen werden soll
lpszRemoteDirectory: String;     // Ordner der auf den server, z.B '' ist das Homeverzeichnis, der Ordner muss nicht existieren auf den Server (es wird zuerst versucht ihn zu erstellen)
UploadSubFolders: Boolean = True; // Angeben ob man will das Unterordner raufgeladen werden auf den Server
wPort: Word = 21)                // Port vom Server
: Boolean;
Ich habe die funktion getestet auf funpic.de, und es scheint perfekt zu funktionieren, hast du rechte um Ordner zu erstellen oder so? Falls nicht, versuch mit lpszRemoteDirectory = ''.

eLse-maestro 20. Okt 2006 14:45

Re: FTP upload ohne INDY ! Kann mir jemand das erklären ?
 
coool danke .. BIG THX ! nach sowas hab ich schon lange gesucht !!
Danke
hdl :lol:

ErazerZ 25. Mai 2007 14:11

Re: FTP upload ohne INDY ! Kann mir jemand das erklären ?
 
Hi,
Ich habe mal eine neue Funktion geschrieben die das Uploaden selber übernimmt und man somit z.B die Upload Zeit berechnen kann oder die KB pro Sekunde.
Delphi-Quellcode:
type
  TUploadCallback = procedure(lpszLocal, lpszRemote: string; dwBytesTotal, dwBytesDone: DWORD; Elapsed: Single);

procedure MyUploadCallback(lpszLocal, lpszRemote: string; dwBytesTotal, dwBytesDone: DWORD; Elapsed: Single);
begin
  with frmMain do
  begin
    Label1.Caption := 'Filename: ' + lpszLocal;
    Label2.Caption := 'Remotename: ' + lpszRemote;
    Label3.Caption := 'Done: ' + Format('%2.n KB/%2.n KB', [dwBytesDone / 1024, dwBytesTotal / 1024]);
    Label4.Caption := 'Percent: ' + IntToStr(Integer(Round((dwBytesDone * 100) / dwBytesTotal)));
    ProgressBar1.Max := 100;
    ProgressBar1.Position := Integer(Round((dwBytesDone * 100) / dwBytesTotal));
    Label5.Caption := 'Elapsed: ' + Format('%2.n sec', [Elapsed]);
    if (Elapsed > 0) then
      Label6.Caption := 'Speed: ' + Format('%2.n KB/sec', [dwBytesDone / Elapsed]);
  end;
end;

function UploadFolder(lpszServer, lpszUsername, lpszPassword, lpszLocalDirectory, lpszRemoteDirectory: String; lpUploadCallback: TUploadCallback = nil; UploadSubFolders: Boolean = True; wPort: Word = 21): Boolean;
const
  sErrorDirectoryUpload = 'Das Verzeichnis "%s" konnte nicht auf den Server geladen werden!';
  sErrorDirectoryCreate = 'Das Verzeichnis "%s" konnte nicht auf dem Server erstellt werden!';
  sErrorDirectorySet   = 'Es konnte nicht in das Verzeichnis "%s" gewechselt werden!';
  sErrorFileCreate     = 'Datei "%s%s" konnte nicht erstellt werden!';
  sErrorFileNotFound   = 'Datei "%s" konnte nicht gefunden werden!';
  sErrorWriting        = 'Es trat ein Fehler während des schreibens in die Datei auf!';
const
  PACKET_SIZE        = 1024 * 2;
var
  hOpen, hConnect: HINTERNET;

  function UploadFile(lpszLocal, lpszRemote: String): Boolean;
  var
    hFile: HINTERNET;
    hLocalFile: THandle;
    dwFileSize: DWORD;
    lpNumberOfBytesRead, lpNumberOfBytesWritten, lpBytesDone, lpStartTicker, lpTicker: DWORD;
    lpBuffer: array[0..PACKET_SIZE] of Byte;
  begin
    // wir sind schon im aktuellem Verzeichnis, deswegen kein FtpSetCurrentDirectory..
    Result := False;
    // ok, jetzt mal lokal überprüfen ob alles da ist und die dateigröße auslesen
    hLocalFile := CreateFile(PChar(lpszLocal), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    if (hLocalFile <> INVALID_HANDLE_VALUE) or (hLocalFile <> 0) then
    begin
      dwFileSize := Windows.GetFileSize(hLocalFile, nil);
      hFile := FtpOpenFile(hConnect, PChar(lpszRemote), GENERIC_WRITE, INTERNET_FLAG_TRANSFER_BINARY, 0);
      if (hFile <> nil) then
      begin
        SetFilePointer(hLocalFile, 0, nil, FILE_BEGIN);
        InternetSetFilePointer(hFile, 0, nil, FILE_BEGIN, 0);
        ZeroMemory(@lpBuffer, SizeOf(lpBuffer));
        lpBytesDone := 0;
        lpNumberOfBytesWritten := 0;
        lpStartTicker := GetTickCount; // Download start
        repeat
          Application.ProcessMessages;
          lpNumberOfBytesRead := 0;
          Sleep(1);
          lpTicker := GetTickCount;
          ReadFile(hLocalFile, lpBuffer, PACKET_SIZE, lpNumberOfBytesRead, nil);
          InternetWriteFile(hFile, @lpBuffer, lpNumberOfBytesRead, lpNumberOfBytesWritten);
          if (lpNumberOfBytesWritten = lpNumberOfBytesRead) then
          begin
            Result := True;
            Inc(lpBytesDone, lpNumberOfBytesWritten);
            if Assigned(lpUploadCallback) then
              lpUploadCallback(lpszLocal, lpszRemote, dwFileSize, lpBytesDone, (lpTicker - lpStartTicker) / 1000);
          end else
          begin
            Result := False;
            MessageBox(HWND_DESKTOP, PChar(sErrorWriting), 'Error', MB_ICONERROR);
            Break;
          end;
        until (lpBytesDone >= dwFileSize);
        InternetCloseHandle(hFile);
      end;
      // datei handle schließen ..
      CloseHandle(hLocalFile);
    end else
    begin
      // datei konnte nicht gefunden werden
      MessageBox(HWND_DESKTOP, PChar(Format(sErrorFileNotFound, [lpszLocal])), 'Error', MB_ICONERROR);
    end;
  end;

  function UploadDirectory(lpszPath, lpszRemote: String): Boolean;
  var
    lpFindFileData: TWIN32FindData;
    hFindFile: THandle;
    szLastDirectory: String;
  begin
    Result := False;
    lpszPath := IncludeTrailingPathDelimiter(lpszPath);
    // wir brauchen hier den Namen vom letzten Verzeichnis, also den den wir gerade durchsuchen, um dann FtpSetCurrentDIrectory
    // aufzurufen.
    lpszRemote := ExcludeTrailingPathDelimiter(lpszRemote);
    if LastDelimiter('\', lpszRemote) > 0 then
      szLastDirectory := Copy(lpszRemote, LastDelimiter('\', lpszRemote) +1, Length(lpszRemote))
    else
    if LastDelimiter('/', lpszRemote) > 0 then
      szLastDirectory := Copy(lpszRemote, LastDelimiter('/', lpszRemote) +1, Length(lpszRemote))
    else
      szLastDirectory := lpszRemote;
    lpszRemote := IncludeTrailingPathDelimiter(lpszRemote);

    if (szLastDirectory <> '') then
    begin
      if not FtpCreateDirectory(hConnect, PChar(szLastDirectory)) then
      begin
        // Verzeichnis konnte nicht erstellt werden, versuche noch in das Verzeichnis zu wechseln
        if not FtpSetCurrentDirectory(hConnect, PChar(szLastDirectory)) then
        begin
          MessageBox(HWND_DESKTOP, PChar(Format(sErrorDirectoryCreate, [szLastDirectory])), 'Error', MB_ICONERROR);
          Exit;
        end;
      end else
      begin
        // Verzeichnis setzen, in dem wir Arbeiten
        if not FtpSetCurrentDirectory(hConnect, PChar(szLastDirectory)) then
        begin
          MessageBox(HWND_DESKTOP, PChar(Format(sErrorDirectorySet, [szLastDirectory])), 'Error', MB_ICONERROR);
          Exit;
        end;
      end;
    end;

    // Prüfen ob das Verzeichnis auf dem lokalen PC existiert.
    if DirectoryExists(lpszPath) then
    begin
      hFindFile := FindFirstFile(PChar(lpszPath + '*.*'), lpFindFileData);
      if (hFindFile <> INVALID_HANDLE_VALUE) then
      begin
        repeat
          if ((String(lpFindFileData.cFileName) = '.') or (String(lpFindFileData.cFileName) = '..')) then
            continue;
          // Dateien vom Verzeichnis uploaden ...
          if (lpFindFileData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0) then
          begin
            if not UploadFile(Format('%s%s', [lpszPath, lpFindFileData.cFileName]), Format('%s', [lpFindFileData.cFileName])) then
            begin
              // Datei konnte nicht erstellt werden!
              MessageBox(HWND_DESKTOP, PChar(Format(sErrorFileCreate, [lpszRemote, lpFindFileData.cFileName])), 'Error', MB_ICONERROR);
              Windows.FindClose(hFindFile);
              Exit;
            end;
          end else
          // Ein Verzeichnis wurde gefunden also in das Verzeichnis wechseln und dort die Dateien suchen und die dann uploaden ..
          begin
            if UploadSubFolders then
            begin
              if not UploadDirectory(Format('%s%s', [lpszPath, lpFindFileData.cFileName]),
                                     Format('%s%s', [lpszRemote, lpFindFileData.cFileName])) then
              begin
                MessageBox(HWND_DESKTOP, PChar(Format(sErrorDirectoryUpload, [lpszPath])), 'Error', MB_ICONERROR);
                Exit;
              end;
            end;
          end;
        until not (FindNextFile(hFindFile, lpFindFileData));
        Windows.FindClose(hFindFile);
        if (szLastDirectory <> '') then
        begin
          // cd ..
          if not FtpSetCurrentDirectory(hConnect, '..') then
          begin
            MessageBox(HWND_DESKTOP, PChar(Format(sErrorDirectorySet, ['..'])), 'Error', MB_ICONERROR);
            Exit;
          end;
        end;
        Result := True;
      end;
    end;
  end;
begin
  Result := False;
  hOpen := InternetOpen('MyAgent', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  if (hOpen <> nil) then
  begin
    hConnect := InternetConnect(hOpen, PChar(lpszServer), wPort, PChar(lpszUsername), PChar(lpszPassword),
                                INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
    if (hConnect <> nil) then
    begin
      Result := UploadDirectory(lpszLocalDirectory, lpszRemoteDirectory);
      InternetCloseHandle(hConnect);
      InternetCloseHandle(hOpen);
    end;
  end;
end;
Beispiel aufruf:
Delphi-Quellcode:
 
  if UploadFolder('meinserver.de', 'meinusername', 'meinpassword', 'c:\tmp', 'etc', @MyUploadCallback) then
    ShowMessage('Verzeichnis erfolgreich geuploaded!');


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