Как заменить символы в строке во время цикла? - PullRequest
0 голосов
/ 04 октября 2019

Я хотел бы проверить, существует ли файл на нескольких серверах. Единственное, что отличается на серверах, это число на сервере, напр. Сервер1, Сервер2, Сервер3 и т. Д.

Как мне написать цикл, который заменяет каждое число на следующее наибольшее число вплоть до, скажем, Сервера 10?

Вотчто у меня пока что:

var fileLocation = @"\\Server1\documents\File.txt";
var newFileInfoTest = fileLocation.Replace("Server1", "Server2");

if (File.Exists(newFileInfoTest))
    txtTextBox.Text = "Server1 -- File copy successful.";
else
    txtTextBox.Text = "Server1 -- File copy unsuccessful";

Ответы [ 4 ]

3 голосов
/ 04 октября 2019

"Как бы я написал цикл, который заменяет каждое число следующим наибольшим числом вплоть до, скажем, сервера 10?"

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

for(int i = 1; i <= 10; i++)
{
    txtTextBox.Text = File.Exists($@"\\Server{i}\documents\File.txt")
        ? $"Server{i} -- File copy successful."
        : $"Server{i} -- File copy unsuccessful";
}

Обратите внимание, что приведенный выше код будет перезаписывать значение txtTextBox.Text на каждой итерации. Вместо этого вы можете захватить все состояния в цикле и затем отобразить их в конце:

txtTextBox.Text = string.Join(Environment.NewLine, Enumerable.Range(1, 10)
    .Select(i => File.Exists($@"\\Server{i}\documents\File.txt")
        ? $"Server{i} -- File copy successful."
        : $"Server{i} -- File copy unsuccessful."));

В комментариях, которые вы задали:

«Как бы вы сделали это, если бы местоположение файла было в переменной?»

Один из способов сделать это - использовать строку формата с заполнителем ({0}), где числобудет идти, а затем использовать string.Format, чтобы заполнить этот заполнитель внутри цикла.

Мы можем извлечь имя сервера из этой строки, используя string.Split на символе \ и захватывая первый элемент.

Например:

var serverPath = @"\\Server{0}\documents\File.txt";

txtTextBox.Text = string.Join(Environment.NewLine, Enumerable.Range(1, 10)
    .Select(i =>
    {
        var thisPath = string.Format(serverPath, i);
        var serverName = thisPath.Split(new[] { '\\' },
            StringSplitOptions.RemoveEmptyEntries).First();
        return File.Exists(thisPath)
            ? $"{serverName} -- File copy successful."
            : $"{serverName} -- File copy unsuccessful.";
    }));
1 голос
/ 04 октября 2019

Вы можете сделать что-то вроде этого, убедитесь, что ваше сообщение не перезаписывается, вы можете использовать построитель строк вместо конкатенации. надеюсь, что вы можете получить логику

    var msg = string.Empty;
    for(int i = 1; i <  11; i++) { 
        var fileLocation = $"\\Server{i}\documents\File.txt";

         if (File.Exists(fileLocation))
         {
           msg += $"Server{i} -- File copy successful.";
         }
         else
         {
           msg += $"Server{i} -- File copy unsuccessful."; 
         }
    }

    txtTextBox.Text = msg;
0 голосов
/ 04 октября 2019

"Как бы я написал цикл, который заменяет каждое число на следующее наибольшее число вплоть до, скажем, сервера 10?"

var numberofServers = 10;
for(int i =0; i <= numberOfServers; i++){
var fileLocation = $"\\Server{i}\\documents\\File.txt";

if(File.Exists(fileLocation)){
//Success
}    
else{
//UnSuccessful
}
}
0 голосов
/ 04 октября 2019

Попробуйте это:

for (int i = 0; i < 11; i++){
 var fileLocation = $@"\\Server{i}\documents\File.txt";

 if (File.Exists(fileLocation))
    txtTextBox.Text = $"Server{i} -- File copy successful.";
 else
    txtTextBox.Text = $"Server{i} -- File copy unsuccessful";
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...