Замена одной конкретной строки в текстовом файле в C#
У меня есть текстовый файл сказать что-то вроде этого:
#TITLE:What's Up
#ARTIST:4 Non Blondes - Whats Up
#MP3:Four Non Blondes - Whats Up.mp3
#COVER:4 Non Blondes - Whats Up [CO].jpg
#BACKGROUND:4 Non Blondes - Whats Up [CO].jpg
#BPM:135
#GAP:32100
это сохранено как 4 Non Blondes - Whats Up.txt В той же папке есть файл MP3, который находится в этом примере: 4 Non Blondes - Whats Up.mp3
Я хочу заменить строку:
#MP3:Four Non Blondes - Whats Up.mp3
в эту строку:
#MP3:4 Non Blondes - Whats Up.mp3
Каждая строка MP3 имеет перед строкой это:
#MP3:[Songname].mp3
Я знаю, что могу сделать это вручную, но у меня есть 2k таких файлов, и все они должны ссылаться на правильный mp3-файл. Я пытаюсь это в C#, но без удачи.
Это то, что я пробовал до сих пор:
private static void testMethod(string path)
{
var x = System.IO.Directory.GetDirectories(path);
foreach (var directory in x)
{
string[] mp3Files = System.IO.Directory.GetFiles(directory, "*.mp3");
string[] txtFiles = System.IO.Directory.GetFiles(directory, "*.txt");
string MP3FileNameWithExtensions = System.IO.Path.GetFileName(mp3Files[0]);
Console.WriteLine(txtFiles[0]);
var lines = System.IO.File.ReadAllLines(txtFiles[0]);
for (int i = 0; i < lines.Length; i++)
{
if(lines[i].Contains("#MP3")){
Console.WriteLine("Jeeeej working");
lines[i] = "#MP3:"+MP3FileNameWithExtensions;
System.IO.File.WriteAllLines(txtFiles[0], lines);
}
}
}
}
3 ответа
Поскольку имя файла.txt файла [Songname].txt
, вы можете использовать Path.GetFilenameWithoutExtension(files[i]), чтобы получить [Songname]
, Затем замените строку #MP3 именем файла + ".mp3". Теперь выпишите файл.
NB. Возможно, вы захотите сделать копию каталога, над которым работаете, на случай, если что-то пойдет не так.
Я знаю, что опаздываю на вечеринку, но вот пример.
public void FixTheFiles(String startFolderPath)
{
foreach (String dirName in Directory.GetDirectories(startFolderPath))
{
FixTheFiles(dirName);
}
foreach (String fileName in Directory.GetFiles(startFolderPath))
{
FileInfo fi = new FileInfo(fileName);
if (fi.Extension.Equals("MP3"))
{
String fileContents = "";
using (StreamReader sr = new StreamReader(File.Open(fileName.Replace(".mp3",".txt"),FileMode.Open)))
{
String currentLine = sr.ReadLine();
if (currentLine.StartsWith("#MP3:"))
{
currentLine = "#MP3:" + fileName.Substring(fileName.LastIndexOf('\\')+1);
}
fileContents += currentLine;
}
using (StreamWriter sw = new StreamWriter(File.Open(fileName.Replace(".mp3",".txt"),FileMode.Open)))
{
sw.Write(fileContents);
}
}
}
}
Я бы одновременно открывал потоковое устройство чтения и потоковое устройство записи (с другим именем файла) и просматривал каждый файл по одной строке за раз, ища любые необходимые изменения. Вы можете выбрать имена файлов с помощью openfiledialog с Multiselect = true или запустить эту команду в окне командной строки, чтобы сгенерировать текстовый файл для вставки в код с кавычками вокруг них в качестве начальных значений для создания экземпляра строкового массива.
dir *.mp3 / b> filenames.txt
string[] array = new string[] {"file0.mp3",
"file1.mp3",
"file2.mp3",
"file3.mp3",
"file4.mp3",
"file5.mp3"};