Замена строки в потоке в C# (без перезаписи исходного файла)


У меня есть файл, который я открываю в потоке и передаю другому методу. Однако я хотел бы заменить строку в файле, прежде чем передавать поток другому методу. Итак:

string path = "C:/...";
Stream s = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
//need to replace all occurrences of "John" in the file to "Jack" here.
CallMethod(s);

Исходный файл не должен быть изменен, только поток. Какой самый простой способ сделать это?

Спасибо...

2 9

2 ответа:

Намного проще, если вы просто читаете в файле строки, а затем разбираетесь с ними, вместо того, чтобы заставлять себя придерживаться Stream, просто потому, что поток имеет дело как с текстовыми, так и с двоичными файлами и должен уметь читать по одному символу за раз (что делает такую замену очень трудной). Если Вы читаете по целой строке за раз (пока у вас нет многострочной замены), это довольно легко.

var lines = File.ReadLines(path)
    .Select(line => line.Replace("John", "Jack"));

Обратите внимание, что ReadLines все еще передает данные, и Select не нужно материализуйте все это, так что вы все еще не читаете весь файл в память за один раз, когда делаете это.

Если вам на самом деле не нужно передавать данные, вы можете просто загрузить их в виде одной большой строки, выполнить замену, а затем создать поток на основе этой строки:

string data = File.ReadAllText(path)
    .Replace("John", "Jack");
byte[] bytes = Encoding.ASCII.GetBytes(data);
Stream s = new MemoryStream(bytes);

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

Я предлагаю вам создать отдельный поток, скажем MemoryStream. Считайте из вашего потока файлов и записывайте в память. Затем вы можете извлечь строки из любого и заменить материал, и вы передадите поток памяти вперед. Это делает его вдвойне уверенным, что вы не путаетесь с исходным потоком, и вы всегда можете прочитать исходные значения из него, когда захотите. нужно, хотя вы используете в основном вдвое больше памяти, используя этот метод.