#c# #file #directory #transfer
#c# #файл #каталог #передача
Вопрос:
У меня возникли проблемы с поиском способа отправки целых папок через TCP. Моя первоначальная идея заключалась в том, что отправитель отправляет строку, содержащую путь к заданному файлу, например C://MyFolder/MySubFolder/MyFile затем получатель создает папки и вложенные папки. Затем отправитель продолжает отправку файлов, содержащих их каталог.
Я думаю, само собой разумеется, что это не лучший метод для этого. Есть ли лучший подход?
Редактировать:
Извините, если я был немного расплывчатым. У меня есть приложение для передачи файлов, которое, очевидно, отправляет / получает файлы, и я хочу добавить способ отправки целых папок.
Комментарии:
1. «Есть ли лучший подход?» — FTP?
2. @Mitch Wheat, Да, к сожалению, это должен быть TCP
Ответ №1:
Для этого вам нужен какой-то протокол передачи файлов (например, FTP). Используйте простую в настройке библиотеку FTP-сервера c # (например, эту:http://sourceforge.net/projects/csftpserver /) на стороне отправки и использовать FtpWebRequest
на стороне клиента, чтобы получить всю структуру папок.
Ответ №2:
Используйте известные методы архивирования (zip, rar …) и передавайте данные. Извлечение на стороне однорангового узла. Таким образом вы экономите:
- Реализация рекурсивного шаблона, подверженного ошибкам.
- Ваша пропускная способность
Комментарии:
1. Да, я использовал DotNetZip и заархивировал всю папку целиком, затем извлек ее на получателе, затем удалил zip-файл. Работает отлично и именно так, как должно, НО, к сожалению, это было отклонено. Я не могу заархивировать файлы
2. Почему это было отклонено? Это домашнее задание, которое было отклонено вашим учителем или у вас техническая проблема? В любом случае, если вы собираетесь реализовать это самостоятельно, вам следует написать рекурсивную функцию, которая перебирает папки, отправляет их имена (вам нужен какой-нибудь собственный простой протокол) и файлы внутри.
3. Да, техническая проблема. Если бы я должен был отправить папку с файлом объемом 5 ГБ внутри нее, потребовалось бы много времени и ресурсов для архивирования. На самом деле я делаю то, что вы говорите прямо сейчас, но это довольно сложно, потому что у приложения-получателя уже есть протокол (плохой) для файлов. Я подумываю переделать принимающее приложение.
4. Итак, у вас ограниченные возможности с устаревшим кодом. Используйте протокол для имен файлов / папок. Начните с корневой папки, передайте имя (одноранговый узел создаст папку), а затем перенесите файлы внутрь. Затем перейдите на следующий уровень и рекурсивно проделайте то же самое (это не так просто, как я говорю!). Я рекомендую вид хэширования, чтобы убедиться, что файл передается без повреждения (например, MD5). Вы должны позаботиться о любой НЕЖЕЛАТЕЛЬНОЙ ситуации, такой как проблемы с сетью… предстоит много работы
5. Да, это было действительно непросто. Это было для компании в рамках нашего практикума. Что я сделал, так это сначала отправил структуру папок, затем получатель создает ее, а файлы передаются после. Спасибо!
Ответ №3:
Вы смотрели на существующие протоколы для этой цели? Кажется, вы хотите клонировать FTP, возможно, с механизмом потоковой передачи, таким как tar, между ними.
Ответ №4:
Если вы рассматриваете возможность архивирования / сжатия: вы могли бы взглянуть на класс GZipStream для этого.
http://www.geekpedia.com/tutorial190_Zipping-files-using-GZipStream.html