Замена одной конкретной строки в текстовом файле в 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"};
Другие вопросы по тегам