Я заметил, что ошибка возникает только тогда, когда я копирую файлы в контролируемую папку, если я перетаскиваю их, все работает нормально?
Похоже, ваше приложение пытаетсячитать локальные файлы, которые все еще записываются на диск (не полностью) или заблокированы другими процессами. Перетаскивание файлов - это «атомарные» операции (то есть очень быстрые), что значительно снижает вероятность получения этой ошибки.
Попробуйте реализовать метод из этого ответа , чтобы проверить, не является ли файл 'заблокирован до звонка UploadFromFile()
. Теперь, в зависимости от вашей логики кода, вам потребуется реализовать некоторую форму «повторных попыток», если файл заблокирован. Вот пример:
protected virtual bool IsFileLocked(FileInfo file)
{
FileStream stream = null;
try
{
stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None);
}
catch (IOException)
{
//the file is unavailable because it is:
//still being written to
//or being processed by another thread
//or does not exist (has already been processed)
return true;
}
finally
{
if (stream != null)
stream.Close();
}
//file is not locked
return false;
}
private void Process(object sender, NotifyCollectionChangedEventArgs e)
{
if (paths.Count > 0)
{
var currentPath = paths.Dequeue();
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(UserSettings.Instance.getConnectionString());
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference(UserSettings.Instance.getContainer());
CloudBlockBlob b = blobContainer.GetBlockBlobReference(System.IO.Path.GetFileName(currentPath));
try
{
FileInfo fi = new FileInfo(currentPath);
while (IsFileLocked(fi))
Thread.Sleep(5000); // Wait 5 seconds before checking again
b.UploadFromFile(currentPath, FileMode.Open);
}
catch (StorageException s)
{
throw new System.InvalidOperationException("Could not connect to the specified storage account. Please check the configuration.");
}
catch (IOException exc)
{
throw new System.InvalidOperationException(exc.StackTrace);
}
}
}
Обратите внимание, что это никоим образом не гарантирует, что файл не будет снова заблокирован другим процессом между вызовом IsFileLocked()
и вызовом b.UploadFromFile()
.