FileInfo.Length больше 0, но файл пуст? - PullRequest
3 голосов
/ 14 октября 2010

У меня есть приложение, которое хрустит кучу текстовых файлов.В настоящее время у меня есть такой код (отрывок):

FileInfo info = new FileInfo(...)
if (info.Length > 0) {
    string content = getFileContents(...);
        // uses a StreamReader
        // returns reader.ReadToEnd();
    Debug.Assert(!string.IsNullOrEmpty(contents)); // FAIL
}

private string getFileContents(string filename)
    {
        TextReader reader = null;
        string text = "";

        try
        {
            reader = new StreamReader(filename);
            text = reader.ReadToEnd();
        }
        catch (IOException e)
        {
            // File is concurrently accessed. Come back later.
            text = "";
        }
        finally
        {
            if (reader != null)
            {
                reader.Close();
            }
        }

        return text;
    }

Почему я получаю ошибочное утверждение?Атрибут FileInfo.Length уже использовался для проверки того, что файл не пуст.строка.Но из-за обсуждения fileInfo.Length () есть кое-что интересное: fileInfo.Length возвращает 2 для пустого текстового файла с маркером only-BOM (созданного в блокноте).

Ответы [ 4 ]

5 голосов
/ 14 октября 2010

Возможно, у вас есть файл, который является пустым, кроме метки порядка байтов. Я думаю, TextReader.ReadToEnd() уберет метку порядка байтов, давая вам пустую строку.

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

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

2 голосов
/ 14 октября 2010

Видите, что у вас есть catch (IOException) блок?Вот что возвращает пустую строку и вызывает утверждение, даже если файл не пустой.

0 голосов
/ 14 октября 2010

Что в методе getFileContents?

Это может быть перемещение указателя потока на конец потока перед вызовом ReadToEnd ().

0 голосов
/ 14 октября 2010

Если я хорошо помню, файл заканчивается концом файла, который не будет включен при вызове ReadToEnd.

Следовательно, размер файла не равен 0, но размер его содержимого равен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...