file.Move без переименования

Я кодирую программу, которая должна считывать теги id3 mp3-файлов, создавать каталог с именем исполнителя, а затем я хочу переместить mp3-файлы в каталог конкретного исполнителя.

Когда я пытаюсь переместить файл Mp3, он не перемещает его в подпапку (названную как «Исполнитель») моего каталога музыки, который я создал. Я просто хочу переместить файлы Mp3, а не переименовывать их.

вот мой код:

   public void moveFiles(string path, string[] title, string[] artist,string [] songs)
    {//loop through the title array
        for(int i=0;i<title.Length;i++)
        {// no artist no name
            if (artist[i] == null)
            { 
                i += 1;
            }//check if sourceFile is existing
            if (File.Exists(songs[i]))
            {//check if destinationFile is existing
                if (File.Exists((@"C:\Musik\" + artist[i] + songs[i])))
                {//if delete
                    File.Delete((@"C:\Musik\" + artist[i] + songs[i]));
                } 
                else
                { //move file from songs[i](sourcePath)to (destinationPath)
                    File.Move(songs[i],(@"C:\Musik\" + artist[i] + songs[i]));                  
                    MessageBox.Show("Das Lied " + title[i] + " wurde erfolgreich verschoben");
                }
            }
            else
            {
                MessageBox.Show(songs[i]+" does not exist!");
            }
        }
    }

Он только перемещает мои файлы в каталог C:\Musik и переименовывает мои файлы, например Artist-Song; Любая помощь приветствуется. Спасибо:)


person Hansanho    schedule 08.05.2014    source источник
comment
Совет: вам не нужно File.Exists. If the file to be deleted does not exist, no exception is thrown. И еще одно: используйте i++ вместо i += 1   -  person Andy    schedule 08.05.2014


Ответы (3)


Вы пропустили обратную косую черту в своем пути. Я настоятельно рекомендую использовать Path.Combine и для этого типа вещей. Это делает его гораздо более читабельным и является более чистым способом, чем чистая конкатенация строк. Также Path.GetFileName() очень полезен... знай это / люби это ;)

File.Move(songs[i], Path.Combine(@"C:\Musik", Path.Combine(artist[i], Path.GetFileName(songs[i]));

ОБНОВЛЕНИЕ

Если вы нацелены на .Net 4.0 или выше, вы можете использовать переопределение 4 строк, чтобы сделать это чище (как указано в предложениях). Если вы нацелены на версию 3.5 или ниже, используйте лучшее решение.

File.Move(songs[i], Path.Combine(@"C:", "Musik", artist[i], Path.GetFileName(songs[i]));
person Evan L    schedule 08.05.2014
comment
За исключением @"C:\Musik\" + artist[i], вместо которого должно быть @"C:\Musik\", artist[i], чтобы полностью использовать Path.Combine - person crashmstr; 08.05.2014
comment
Я отредактировал это либо для версии 3.5 или ниже, либо для версии 4.0 или выше. - person Evan L; 08.05.2014
comment
+1, ориентируясь на более чем одну версию .NET Framework. - person HuorSwords; 08.05.2014
comment
Если вы используете версию 3.5 или более раннюю, сцепите вызовы так, чтобы вы всегда использовали Path.Combine, а не +. - person crashmstr; 08.05.2014
comment
@crashmstr Почистил по вашему предложению. - person Evan L; 08.05.2014

Вы пропустили одну обратную косую черту ("\") в своем коде.

// By popular suggestion, using Path.Combine...
const string dstRootDirectoryName = @"C:\Musik";
var destinationFileName = Path.Combine(dstRootDirectoryName, artist[i], songs[i]);
if (File.Exists(destinationFileName)
{
    File.Delete(destinationFileName);
}
else
{
    File.Move(songs[i], destinationFileName);
    MessageBox.Show("The file:" + title[i] + " was moved");
}
person HuorSwords    schedule 08.05.2014
comment
Path.Combine было бы лучше. И songs[i], вероятно, содержит полный путь, а не только имя файла. - person Raphaël Althaus; 08.05.2014
comment
@RaphaëlAlthaus Мы предполагаем, что это полный путь, потому что он работает как первый параметр File.Move - person Evan L; 08.05.2014
comment
@crashmstr согласен. Обновленный ответ с использованием метода Path.Combine(). Спасибо за ваше предложение. - person HuorSwords; 08.05.2014
comment
@EvanL есть переопределение параметра из 4 строк. документ - person HuorSwords; 08.05.2014
comment
Занимает до 4 или params string[] paths в .Net 4 и выше. - person crashmstr; 08.05.2014
comment
@crashmstr в .Net 4 и выше, я использовал 3.5... ОП не указал. - person Evan L; 08.05.2014

File.Move(songs[i],(@"C:\Musik\" + artist[i] + songs[i]));

Добавьте косую черту между папками:

File.Move(songs[i],String.Format("C:\Musik\{0}/{1}", artist[i], songs[i]));

Кроме того, рассмотрите возможность использования String.Format вместо обычной конкатенации строк, это выглядит более читаемым IMO.

person Rodrigo Silva    schedule 08.05.2014
comment
Или позволить .Net сделать всю работу за вас и использовать Path.Combine? - person crashmstr; 08.05.2014