2016-06-07 2 views

ответ

1

Вы не можете этого сделать. FileSystemWatcher наблюдает за файловой системой, а не с FTP-папкой. Поэтому, если у вас нет доступа к файловой системе на FTP-путь (поддерживаются пути UNC), вы не можете этого сделать.

+0

Я хочу обнаружить добавление файла в каталог ftp, а затем для работы с этим файлом –

+1

Вы не можете обнаружить добавление файла в каталог ftp. Вы должны реализовать что-то вроде опроса с помощью таймера или что-то, чтобы проверить содержимое папки. Для этого вы можете использовать System.Net.FtpClient. То, что вы хотите сделать, невозможно. –

0

Вы не можете использовать FileSystemWatcher или любым другим способом, так как FTP-протокол не имеет API для уведомления клиента об изменениях в удаленном каталоге.

Все, что вы можете сделать, чтобы периодически перебирать удаленное дерево и находить изменения.

На самом деле это довольно просто реализовать, если вы используете FTP-клиент, который поддерживает рекурсивный список удаленного дерева. К сожалению, встроенный FTP-клиент .NET, FtpWebRequest нет. Например, с помощью WinSCP .NET assembly вы можете использовать Session.EnumerateRemoteFiles method.

Смотрите статью Watching for changes in SFTP/FTP server:

// Setup session options 
SessionOptions sessionOptions = new SessionOptions 
{ 
    Protocol = Protocol.Ftp, 
    HostName = "example.com", 
    UserName = "user", 
    Password = "password", 
}; 

using (Session session = new Session()) 
{ 
    // Connect 
    session.Open(sessionOptions); 

    List<string> prevFiles = null; 

    while (true) 
    { 
     // Collect file list 
     List<string> files = 
      session.EnumerateRemoteFiles(
        "/remote/path", "*.*", EnumerationOptions.AllDirectories) 
       .Select(fileInfo => fileInfo.FullName) 
       .ToList(); 
     if (prevFiles == null) 
     { 
      // In the first round, just print number of files found 
      Console.WriteLine("Found {0} files", files.Count); 
     } 
     else 
     { 
      // Then look for differences against the previous list 
      IEnumerable<string> added = files.Except(prevFiles); 
      if (added.Any()) 
      { 
       Console.WriteLine("Added files:"); 
       foreach (string path in added) 
       { 
        Console.WriteLine(path); 
       } 
      } 

      IEnumerable<string> removed = prevFiles.Except(files); 
      if (removed.Any()) 
      { 
       Console.WriteLine("Removed files:"); 
       foreach (string path in removed) 
       { 
        Console.WriteLine(path); 
       } 
      } 
     } 

     prevFiles = files; 

     Console.WriteLine("Sleeping 10s..."); 
     Thread.Sleep(10000); 
    } 
} 

(я автор WinSCP)


Хотя, если вы на самом деле хотите, чтобы просто загрузить изменения, это способ проще , Просто используйте Session.SynchronizeDirectories в цикле.

session.SynchronizeDirectories(
    SynchronizationMode.Local, "/remote/path", @"C:\local\path", true).Check(); 

Если вы не хотите использовать 3rd библиотеку партии, вы должны делать с ограничениями FtpWebRequest. Например, как рекурсивно перечислить дерево удаленных каталогов с помощью FtpWebRequest, см. Мой ответ на C# Download all files and subdirectories through FTP.