Чтение (/ запись) файлов в C # - PullRequest
2 голосов
/ 21 ноября 2010

Недавно я хотел отследить прогресс загрузки HTTPWebRequest. Поэтому я начал с малого и начал с буферизованного чтения простого текстового файла. Затем я обнаружил, что простая задача, как

File.ReadAllText("text.txt");

становится чем-то вроде ниже, со всеми потоками, читателями, писателями и т. Д. Или что-то можно удалить? Также код ниже не работает. Возможно, я сделал что-то не так, какой способ чтения (я думаю, запись будет похожей) в буфер, чтобы я мог отслеживать прогресс, предполагая, что поток не локальный, например WebRequest

byte[] buffer = new byte[2560]; // 20KB Buffer, btw, how should I decide the buffer size?
int bytesRead = 0, read = 0;
FileStream inStream = new FileStream("./text.txt", FileMode.Open, FileAccess.Read);
MemoryStream outStream = new MemoryStream();
BinaryWriter outWriter = new BinaryWriter(outStream);

// I am getting "Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection."
// inStream.Length = Length = 9335092
// bytesRead = 2560
// buffer.Length = 2560
while ((read = inStream.Read(buffer, bytesRead, buffer.Length)) > 0)
{
    outWriter.Write(buffer);
    //outStream.Write(buffer, bytesRead, buffer.Length);
    bytesRead += read;
    Debug.WriteLine("Progress: " + bytesRead / inStream.Length * 100 + "%");
}
outWriter.Flush();

txtLog.Text = outStream.ToString(); 

Обновление: решение

byte[] buffer = new byte[2560];
int bytesRead = 0, read = 0;
FileStream inStream = File.OpenRead("text.txt");
MemoryStream outStream = new MemoryStream();

while ((read = inStream.Read(buffer, 0, buffer.Length)) > 0)
{
    outStream.Write(buffer, 0, buffer.Length);
    bytesRead += read;
    Debug.WriteLine((double)bytesRead / inStream.Length * 100);
}

inStream.Close();
outStream.Close();

Ответы [ 3 ]

0 голосов
/ 21 ноября 2010

Поскольку вы, похоже, читаете текст (хотя я могу ошибаться), кажется, что ваша программа может быть намного проще, если вы читаете символ за символом вместо вызова стандартного Read ():

BinaryReader reader = new BinaryReader(File.Open("./text.txt", FileMode.Open));
MemoryStream outStream = new MemoryStream();
StreamWriter outWriter = new StreamWriter(outStream);

while (Reader.BaseStream.Position < Reader.BaseStream.Length)
{
    outWriter.Write(reader.ReadChar());
    Debug.WriteLine("Progress: " + ((double)reader.BaseStream.Position) / (double)(reader.BaseStream.Length) + "%");
}
outWriter.Close();
txtLog.Text = outStream.ToString();
0 голосов
/ 21 ноября 2010

Поскольку вам нужно только проверить ход операции загрузки, вы можете просто проверить размер файла с помощью объекта fileinfo.

В классе FileInfo есть свойство с именем length, которое возвращает размер файла вбайт.Не уверен, дает ли он текущий размер при записи файла.Но я думаю, что стоит попробовать, так как он более простой и эффективный, чем метод, который вы используете

0 голосов
/ 21 ноября 2010

должно быть

outWriter.Write(buffer,0,read);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...