Замена строки в потоке в 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 ответа:
Намного проще, если вы просто читаете в файле строки, а затем разбираетесь с ними, вместо того, чтобы заставлять себя придерживаться
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
. Считайте из вашего потока файлов и записывайте в память. Затем вы можете извлечь строки из любого и заменить материал, и вы передадите поток памяти вперед. Это делает его вдвойне уверенным, что вы не путаетесь с исходным потоком, и вы всегда можете прочитать исходные значения из него, когда захотите. нужно, хотя вы используете в основном вдвое больше памяти, используя этот метод.