Пункт использования закроет этот поток?

Проблема из-за несоответствия между _layouts/home.html и темой. Макет требует трех включений, которые не существуют ни в вашем хранилище, ни внутри jekyll-theme-minimal .

Решение состоит в том, чтобы либо удалить пользовательский макет, либо добавить три включения в свой репозиторий.

30
задан Dawid Ferenczy Rogožan 17 March 2016 в 19:32
поделиться

5 ответов

Да, StreamReader.Dispose закрывает базовый поток (для всех общедоступных способов создать один). Однако существует более хорошая альтернатива:

using (TextReader reader = File.OpenText("file.txt"))
{
}

Это обладает дополнительным преимуществом, что оно открывает базовый поток с подсказкой к Windows, что Вы будете получать доступ к нему последовательно.

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

using System;
using System.IO;

class Program
{
    public static void Main(string[] args)
    {
        for (int i=0; i < 1000; i++)
        {
            using(StreamReader sr = new StreamReader
                  (File.Open("somefile.txt", FileMode.Open)))
            {
                Console.WriteLine(sr.ReadLine());
            }
            File.Move("somefile.txt", "somefile.bak");
            File.Move("somefile.bak", "somefile.txt");
        }
    }
}

Если это работает, это предполагает, что это - что-то, чтобы сделать, с каким Вы делаете при чтении...

И теперь вот сокращенная версия Вашего отредактированного кода вопроса - который снова хорошо работает для меня, даже на сетевом ресурсе. Обратите внимание, что я изменился FileMode.Create кому: FileMode.CreateNew - как иначе, возможно, все еще было приложение с дескриптором на старом файле, потенциально. Это работает на Вас?

using System;
using System.IO;

public class Test
{    
    static void Main()
    {
        StreamWriter creditsFile = new StreamWriter(File.Open("test.txt", 
                                          FileMode.CreateNew));

        creditsFile.WriteLine("code\\inc");

        creditsFile.Close();
        creditsFile.Dispose();

        File.Move("test.txt", "test2.txt");
    }
}
39
ответ дан Jon Skeet 27 November 2019 в 23:57
поделиться

Отметьте - Ваши блоки использования не должны быть вложены в их собственных блоках - они могут быть последовательными, как в:

using(FileStream fs = File.Open("somefile.txt", FileMode.Open))
using(StreamReader sr = new StreamReader(fs))
{
    //read file
}

Порядок распоряжения в этом случае является все еще тем же как вложенными блоками (т.е., StreamReader все еще расположит перед FileStream в этом случае).

11
ответ дан Not Sure 27 November 2019 в 23:57
поделиться

Есть ли возможность, что что-то еще имеет блокировку к somefile.txt?

Простая проверка от локального (в файл) cmd строка

net files

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

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

0
ответ дан Zhaph - Ben Duguid 27 November 2019 в 23:57
поделиться

Я попытался бы использовать FileInfo.Open() и FileInfo.MoveTo() вместо File.Open() и File.Move(). Вы могли также попытаться использовать FileInfo.OpenText(). Но это просто предложения.

1
ответ дан MartinStettner 27 November 2019 в 23:57
поделиться

Так как это, кажется, не проблема кодирования, я собираюсь надеть свою syadmin шляпу и предложить несколько предложений.

  1. Вирусный сканер или на клиенте или на сервере, это сканирует файл, поскольку он создается.
  2. Windows оппортунистическая блокировка имеет привычку к завинчиванию вещей на сетевых ресурсах. Я вспоминаю это являющийся главным образом проблемой с несколькими клиентами чтения-записи с базами данных на основе плоских файлов, но кэширование могло, конечно, объяснить Вашу проблему.
  3. Файл Windows открывает кэш. Я не уверен, является ли это все еще проблемой в Win2K или нет, но FileMon сказал бы Вам.

Править: Если можно застать его на месте от машины сервера, то Дескриптор Sysinternal скажет Вам, что имеет его открытый.

0
ответ дан Mark Brackett 27 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

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