Мой код выполняет поиск внутри цикла, если был создан файл * txt. Если файл не будет создан по прошествии x времени, я вызову исключение. Вот мой код:

 var AnswerFile = @"C:\myFile.txt";

 for (int i = 0; i <= 30; i++)
 {
     if (File.Exists(AnswerFile))
          break;
      await Task.Delay(100);
 }

 if (File.Exists(AnswerFile))
 {
 }
 else
 { 
 }

После цикла я проверяю свой файл, был ли он создан или нет. Цикл истечет через 3 секунды, 100 мс * 30 раз. Мой код работает, я просто ищу производительность и качество своего кода. Есть ли лучший подход, чем мой? Пример, следует ли мне использовать вместо этого класс FileInfo?

  var fi1 = new FileInfo(AnswerFile);
  if(fi1.Exists)
  {
  }

Или мне следует использовать класс filewatcher?

c#
-1
Δημήτρης Χριστοφορίδης 18 Окт 2019 в 08:52
Проверьте секундомер. он скажет, какой из них быстрее. Но почему 3 секунды? Почему бы вам не проверить, существует ли этот файл, когда он вам нужен или когда вы закончили с ним?
 – 
GBursali
18 Окт 2019 в 09:00
Я отправляю запрос в другое программное обеспечение, а затем жду, пока это программное обеспечение экспортирует текстовый файл. Обычно время составляет около 1 секунды
 – 
Δημήτρης Χριστοφορίδης
18 Окт 2019 в 10:35

2 ответа

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

Раньше я использовал это для просмотра файлов, загружаемых через ftp. Как только появляется уведомление о созданном файле, я помещаю файл в список и периодически проверяю, растет ли он - вы можете либо посмотреть событие lastwritetime наблюдателя файловой системы, либо напрямую проверить размер файла сейчас vs некоторое время назад и т. д. - при любом подходе, вероятно, проще всего использовать словарь для отслеживания файла и предыдущего размера / последнего события lastwritedate. После минуты отсутствия роста я считаю файл загруженным полностью и обрабатываю его. Возможно, вам будет разумно реализовать аналогичную задержку, если вы используете наблюдатель файловой системы, и файлы прибывают с помощью некоторого медленного метода генерации.

3
Caius Jard 18 Окт 2019 в 09:07

Почему вы не получаете список имен файлов, а затем выполняете поиск в этом списке? Вы можете использовать Directory.GetFiles, чтобы получить список файлов внутри каталога, а затем выполнить поиск в этом списке. Это было бы более исправимо для вас, поскольку вы создадите список один раз и повторно используете его в приложении, вместо того, чтобы вызывать File.Exists для каждого файла.

Пример :

var path = @"C:\folder\"; // set the folder path, which contains all answers files

var ext = "*.txt"; // set the file extension. 
// GET filename list (bare name) and make them all lowercase.
var files = Directory.GetFiles(path, ext).Select(x=> x.Substring(path.Length, (x.Length - path.Length) - ext.Length + 1 ).Trim().ToLower()).ToList();


// Search for this filename 
var search = "myFile";

// Check 
if(files.Contains(search.ToLower()))
{
    Console.WriteLine($"File : {search} is already existed.");
}
else
{
    Console.WriteLine($"File : {search} is not found.");
}
0
iSR5 18 Окт 2019 в 10:40
Файл Cuase txt будет создан из внешнего программного обеспечения примерно через 1 секунду. Поэтому мне нужно каждую секунду принимать все файлы каталога.
 – 
Δημήτρης Χριστοφορίδης
19 Окт 2019 в 15:20