Ожидание загрузки файла с использованием C# - PullRequest
0 голосов
/ 06 августа 2020

Я использую C# для загрузки разных файлов по URL-адресу и их последующего запуска из физического пути к файлу в системе, однако мне нужно дождаться, пока файл не будет полностью записан, и только затем запустить его. Причина в том, что для сохранения некоторых файлов потребуется больше времени, чем для других, и я не могу использовать Thread.Sleep () для этой цели.

Я пробовал этот код, но по какой-то причине он не такой гибкий , так как я не могу точно сказать, сколько попыток или сколько времени должно пройти до сохранения файла. Это всегда зависит от соединения inte rnet, а также от размера файла.

   WebClient client = new WebClient();
   var downloadTask = client.DownloadFileTaskAsync(new Uri(url), filepath);
   var checkFile = Task.Run(async () => await downloadTask);
   WaitForFile(filepath, FileMode.CreateNew);

-

    FileStream WaitForFile(string fullPath, FileMode mode)
    {
        for (int numTries = 0; numTries < 15; numTries++)
        {
            FileStream fs = null;
                try
                {
                    fs = new FileStream(fullPath, mode);
                    return fs;
                }

                catch (IOException)
                {
                    if (fs != null)
                    {
                        fs.Dispose();
                    }
                    Thread.Sleep(50);
                }
        }

        return null;
    }

Есть ли способ продолжать ждать, пока File.Length> 0?

Буду признателен за любую помощь.

Спасибо.

Ответы [ 3 ]

1 голос
/ 07 августа 2020

Вы не ждете завершения загрузки файла. Или, лучше сказать, вы ждете в другом потоке, а затем выбрасываете этот результат. Просто подождите тем же способом, и вам больше не понадобится отдельный способ узнать, когда файл загружен

WebClient client = new WebClient();
await client.DownloadFileTaskAsync(new Uri(url), filepath);
0 голосов
/ 07 августа 2020

Думаю, это все, что вам нужно сделать:

WebClient client = new WebClient();
 await client.DownloadFileTaskAsync(new Uri(url), filepath);
 // code continues when the file finishes downloading
0 голосов
/ 07 августа 2020

Вы можете использовать FileSystemWatcher, чтобы получить событие, когда файл меняет свой размер или появляется новый файл https://docs.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher.onchanged?view=netcore-3.1

Но вы не можете точно сказать, полностью ли загружен файл. способом, если вы не знаете его размер.

Вам просто нужно изменить код, который загружает файл, чтобы он уведомлял, когда файл загружен.

...