Из-за проблем с файлом, который я хочу прочитать (когда он был открыт словом, когда я попытался прочитать вариант File.Open, и мне пришлось использовать FileStream + StreamReader, чтобы избежать этой проблемы), мне пришлось переключиться с использования файла. Откройте и используйте полученный FileStream для чтения, чтобы
using (StreamReader sourceStream =
new StreamReader(
new FileStream(filePath, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite),
Encoding.Default))
А затем с помощью получателя данных для чтения файла.
Теперь мне интересно: Поскольку я теперь читаю массив символов и использую Encoding (Encoding.Default), есть ли что-нибудь в отношении кодирования, которое теперь отличается от варианта, который у меня был раньше (до того, как я использовал File. Откройте, а затем прочитайте массив байтов из FileStream). Таким образом, я должен быть более осторожным в отношении кодирования, чем раньше?
Почему вы хотите использовать StreamReader
? Он предназначен для чтения символов, а не байтов, поэтому для этого требуется параметр кодирования. Вы можете просто читать непосредственно из FileStream
с помощью методов FileStream.Read
или FileStream.ReadByte
.
UPD:
Статический метод File.Open
имеет те же параметры, что и конструктор FileStream. Значит, вы не можете просто передать те же параметры этому методу?
public static FileStream Open(
string path,
FileMode mode,
FileAccess access,
FileShare share
)
UPD2:
Вы можете прочитать следующее консольное приложение, чтобы увидеть различия. Просто измените filePath на любой текстовый файл с кодировкой UTF8.
using System;
using System.Text;
using System.IO;
namespace FileReadTest
{
class Program
{
private static void Main(string[] args)
{
string fileName = "d:\\utf.txt";
Console.WriteLine("Reding using File.Open");
using (var stream = File.Open(fileName, FileMode.Open, FileAccess.Read))
{
int oneByte = stream.ReadByte();
while (oneByte != -1)
{
Console.WriteLine(oneByte);
oneByte = stream.ReadByte();
}
};
Console.WriteLine("Reading using StreamReader");
using (
StreamReader sourceStream =
new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite),
Encoding.Default))
{
int oneChar = sourceStream.Read();
while (oneChar != -1)
{
Console.WriteLine(oneChar);
oneChar = sourceStream.Read();
}
}
}
}
}
Я использовал файл, содержащий "123abc", и он содержит некоторые маркерные байты в начале кодировки UTF8. Выход будет еще более очевидным, если вы поместите в этот файл определенные символы, такие как русский или китайский.