Лучший способ скопировать много файлов в удаленное хранилище?
привет
мне нужно скопировать много файлов изображений (более тысячи изображений, каждое из которых составляет максимум 1 МБ), которые хранятся на разных машинах в интрасети, в центральное хранилище NAS.
для этого я напишу программу на C#..
каков наиболее эффективный метод выполнения этой работы? достаточно ли (File.Copy) или...?
Этот процесс будет ежедневной работой,
и это не просто процесс копирования ... файлы должны быть организованы в определенную иерархию, и их информация должна обновляться в базе данных, поэтому я думаю, что приложения синхронизации не будут работать для меня
Поскольку мне нужно обновить статус файла в базе данных, то мне нужно знать, когда процесс копирования файла завершен, и был ли он успешным или неудачным (в общем, иногда файлы по какой-то причине повреждаются при неудачном копировании)
Что я уже пробовал:
я попробовал файл.Копирование для небольшого количества файлов.. но я не пробовал его для большого количества.
phil.o
В каких терминах он наиболее эффективен? Очевидно, что ваши требования идут дальше простого копирования файла: вы должны получить исходный файл, связать его с записью в базе данных, классифицировать его по критериям, которые мы не знаем, затем скопировать его в пункт назначения, возможно, проверить контрольной суммой, что он не был изменен в процессе, затем, если проверка прошла успешно, удалить исходный файл и обновить запись базы данных новым путем.
Файл.Копирование может выполнять свою работу, но это лишь малая часть всего процесса.
nina4ever
вы правы. это целый процесс, и то, что вы упомянули, правильно.
но в своем вопросе я беспокоюсь только об эффективности самого копирования, так как у меня есть большое количество файлов, и мне нужен способ убедиться, что они были скопированы правильно, например, без повреждения, и, конечно же, мне нужно знать, когда копия файла закончилась (как я помню, по файлу.Копия нет никакого уведомления, когда копия закончена)..
phil.o
Если вы хотите иметь представление о ходе выполнения операции копирования, вы можете перейти к потокам. Вы найдете множество примеров копирования файлов с потоками, использующими делегаты для сигнализации текущего прогресса. Файл.Copy не предоставляет эту функцию.
nina4ever
спасибо за вашу помощь. я попробую это сделать
nina4ever
я нашел эти ответы. они хорошие?
https://stackoverflow.com/questions/39591579/how-to-use-filestream-for-copying-files-in-c-sharp
https://stackoverflow.com/questions/3427185/using-filestream-classes-to-copy-files-why-does-output-not-match-input
phil.o
Да, это так. Есть также статья о КП: Управление копированием файлов с индикацией хода выполнения[^]
nina4ever
я знаю, как использовать учетные данные для копирования файлов с удаленной машины на локальный путь и наоборот ... но.. как это сделать, если и источник, и назначение являются удаленными машинами и им обоим нужны учетные данные?
phil.o
Тогда, я думаю, вам нужно предоставить учетные данные для них обоих.
nina4ever
конечно.. я обычно использую этот класс
чтобы получить доступ к удаленной машине, используя ее IP-адрес и учетные данные :
https://gist.github.com/AlanBarber/92db36339a129b94b7dd
но я не могу переключить соединение на конечный IP-адрес в середине копирования !!
должен ли я сначала скопировать файлы из исходного файла во временную локальную папку, а затем получить доступ к месту назначения и повторно скопировать файл??? или есть способ получить разрешение на доступ к 2 IP-адресам одновременно ??
phil.o
Вам нужны два различных экземпляра класса NetworkConnection, каждый со своими собственными учетными данными.
nina4ever
спасибо
Sinisa Hajnal
1000 файлов-это не слишком много для любой разумной системы. Сосредоточьтесь на остальной функциональности.
nina4ever
проблема в том, что некоторые ссылки в интрасети компании между удаленными машинами и центральным хранилищем работают медленно ... вот почему процесс копирования не так уж тривиален