- Регистрация
- 08.11.2015
- Сообщения
- 1 788
- Благодарностей
- 2 454
- Баллы
- 113
Есть задача изменить названия примерно для 100 000 папок.
В каждой папке в одном файле произвести замену в определенной строке.
В данный момент использую примерно такой метод (исходник ниже), в который подаю подключение один раз и в цикле прохожу по нужным папкам.
Проблема в том, что работа с одной папкой занимает около 2-3 секунд.
Можно ли как-то ускорить процесс (например можно ли работать с SftpClient в многопотоке?)?
Может быть кто-то предложит какой-то более рациональный вариант?
Всё скачать и залить обратно - не вариант (время загрузки одной папки по FTP многократно превышает время изменение имени и замены в файле).
В каждой папке в одном файле произвести замену в определенной строке.
В данный момент использую примерно такой метод (исходник ниже), в который подаю подключение один раз и в цикле прохожу по нужным папкам.
Проблема в том, что работа с одной папкой занимает около 2-3 секунд.
Можно ли как-то ускорить процесс (например можно ли работать с SftpClient в многопотоке?)?
Может быть кто-то предложит какой-то более рациональный вариант?
Всё скачать и залить обратно - не вариант (время загрузки одной папки по FTP многократно превышает время изменение имени и замены в файле).
C#:
public static bool ReplaceDomainEndDir(SftpClient ftp, string olddomain, string newdomain){
string line = string.Empty;
string old_php = string.Format(@"/var/www/{0}/index.php",olddomain);
string old_dir = string.Format(@"/var/www/{0}",olddomain);
string new_dir = string.Format(@"/var/www/{0}",newdomain);
string new_php = string.Format(@"/var/www/{0}/index.php",newdomain);
bool check_out = false;
try {
using (var ms = new MemoryStream()) {
bool check = ftp.Exists(old_dir);
line += check ? "1" : "0";
check = ftp.Exists(old_php);
line += check ? "1" : "0";
if(check) { // Замена содержимого файла
ftp.DownloadFile(old_php, ms);
string txt = Convert.ToBase64String(ms.ToArray());
txt = Encoding.UTF8.GetString(Convert.FromBase64String(txt));
txt = Regex.Replace(txt, @"(?<=\$domain\ =\ 'http://).*?(?=';)", newdomain, RegexOptions.IgnoreCase);
using (var mss = new MemoryStream(Encoding.UTF8.GetBytes(txt))) {
ftp.UploadFile(mss, old_php, null);
}
}
check = ftp.Exists(new_dir);
line += check ? "1" : "0";
check = ftp.Exists(new_php);
line += check ? "1" : "0";
if(!check) ftp.RenameFile(old_dir, new_dir);
check = ftp.Exists(old_dir);
line += check ? "1" : "0";
check = ftp.Exists(old_php);
line += check ? "1" : "0";
check = ftp.Exists(new_dir);
line += check ? "1" : "0";
check = ftp.Exists(new_php);
line += check ? "1" : "0";
}
}
catch {
// ошибка line != "11000011"
}
if(line == "11000011") check_out = true;
return check_out;
}