Ваш код в порядке. Я выполнял их без каких-либо изменений на сервере приложений Tomcat 8
. Используйте Maven для упаковки war
, mvn clean package
.
Считайте файл, удалите строку в памяти и отложите содержание в файл (перезапись). Если файл является большим, Вы могли бы хотеть считать его строка для строки и создание временного файла, позже заменив исходный.
Для очень большие файлы я сделал бы что-то вроде этого
string tempFile = Path.GetTempFileName();
using(var sr = new StreamReader("file.txt"))
using(var sw = new StreamWriter(tempFile))
{
string line;
while((line = sr.ReadLine()) != null)
{
if(line != "removeme")
sw.WriteLine(line);
}
}
File.Delete("file.txt");
File.Move(tempFile, "file.txt");
Обновление , я первоначально записал это обратно в 2009, и я думал, что это могло бы быть интересно с обновлением. Сегодня Вы могли выполнить вышеупомянутое использование LINQ и задержали выполнение
var tempFile = Path.GetTempFileName();
var linesToKeep = File.ReadLines(fileName).Where(l => l != "removeme");
File.WriteAllLines(tempFile, linesToKeep);
File.Delete(fileName);
File.Move(tempFile, fileName);
, код выше является почти точно тем же как первым примером, читая линию за линией и при хранении минимального объема данных в памяти.
правовая оговорка А могла бы быть в порядке все же. Так как мы говорим о текстовых файлах здесь, необходимо было бы очень редко использовать диск в качестве промежуточного носителя. Если Вы не имеете дело с очень большими файлами журнала не должно быть никакой проблемы, читая содержание в память вместо этого и не избегать необходимости соглашение с временным файлом.
File.WriteAllLines(fileName,
File.ReadLines(fileName).Where(l => l != "removeme").ToList());
Примечание, что Эти .ToList
крайне важно здесь для принуждения непосредственного выполнения. Также обратите внимание, что все примеры предполагают, что текстовые файлы являются закодированным UTF-8.
Я соглашаюсь с John Saunders, это не действительно конкретный C#. Однако отвечать на Ваш вопрос: в основном необходимо переписать файл. Существует два способа, которыми можно сделать это.
File.ReadAllLines
) List<string>
, тогда удаляют строку) File.WriteAllLines
) - потенциально преобразовывает List<string>
в массив строк снова с помощью ToArray
, Который означает, что необходимо знать, что у Вас есть достаточно памяти все же. Альтернатива:
TextReader
/ TextWriter
, например, с File.OpenText
и File.CreateText
) TextReader.ReadLine
) - если Вы не хотите удалять его, пишут это в выходной файл (TextWriter.WriteLine
) using
операторы для обоих, то это произойдет автоматически) Я был бы очень просто:
Удаляют блок кода из нескольких файлов
, Чтобы подробно остановиться на ответе @Markus Olsson, я должен был удалить блок кода из нескольких файлов. У меня были проблемы со шведскими символами в базовом проекте, таким образом, я должен был установить Систему. Текст. Пакет CodePagesEncodingProvider nuget и Система использования. Текст. Кодирование. GetEncoding (1252) вместо Системы. Текст. Кодирование. UTF8.
public static void Main(string[] args)
{
try
{
var dir = @"C:\Test";
//Get all html and htm files
var files = DirSearch(dir);
foreach (var file in files)
{
RmCode(file);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
throw;
}
}
private static void RmCode(string file)
{
string tempFile = Path.GetTempFileName();
using (var sr = new StreamReader(file, Encoding.UTF8))
using (var sw = new StreamWriter(new FileStream(tempFile, FileMode.Open, FileAccess.ReadWrite), Encoding.UTF8))
{
string line;
var startOfBadCode = "<div>";
var endOfBadCode = "</div>";
var deleteLine = false;
while ((line = sr.ReadLine()) != null)
{
if (line.Contains(startOfBadCode))
{
deleteLine = true;
}
if (!deleteLine)
{
sw.WriteLine(line);
}
if (line.Contains(endOfBadCode))
{
deleteLine = false;
}
}
}
File.Delete(file);
File.Move(tempFile, file);
}
private static List<String> DirSearch(string sDir)
{
List<String> files = new List<String>();
try
{
foreach (string f in Directory.GetFiles(sDir))
{
files.Add(f);
}
foreach (string d in Directory.GetDirectories(sDir))
{
files.AddRange(DirSearch(d));
}
}
catch (System.Exception excpt)
{
Console.WriteLine(excpt.Message);
}
return files.Where(s => s.EndsWith(".htm") || s.EndsWith(".html")).ToList();
}