blood-moon
@blood-moon
Фрилансер

Не освобождается поток или другая причина недоступности файла?

Есть list в котором пути к n колл. файлов , от туда по очереди дёргая пути к файлам и отправляю . Не думаю что это важно , просто интересно почему 1 код отрабатывает как надо а 2 нет . Вроде бы оба рабочие должны быть
Если использую вот этот код то всё работает
using (var uplfileStream = System.IO.File.OpenRead(uploadFile))
                    {
                        client.UploadFile(uplfileStream, Path.GetFileName(uploadFile), true);
                    }


А если вот этот то на 2 файле (1 успешно) выдаёт ошибку
Отказано в доступе по пути

using (var fileStream = new FileStream(uploadFile, FileMode.Open))
                    {
                        client.BufferSize = 4 * 1024; 
                        client.UploadFile(fileStream, Path.GetFileName(uploadFile));
                        fileStream.Close();
                    }

Хотелось бы узнать причину
  • Вопрос задан
  • 42 просмотра
Пригласить эксперта
Ответы на вопрос 2
Тебе не нужно самостоятельно вызывать Close, когда у тебя уже обёрнуто в using.

Но я не уверен, что проблема именно в этом.
Ответ написан
WNeZRoS
@WNeZRoS
Вот так выглядит File.OpenRead:
public static FileStream OpenRead(string path)
{
   return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
}

А так конструктор с двумя параметрами для FileStream:
internal const FileShare DefaultShare = FileShare.Read;

public FileStream(string path, FileMode mode)
    : this(path, mode, mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite, DefaultShare, DefaultBufferSize, DefaultIsAsync) {}


Собственно главная разница в переданном FileAccess. В случае OpenRead файл открывается только для чтения, а в случае FileStream и на чтение и на запись. Переданный FileShare позволяет только читать файл из нескольких мест, и при открытии с FileAccess.ReadWrite как раз получается ваша проблема (т.к. оно хочет ещё и писать в файл).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы