2013-02-12 4 views
2

В Windows после двойного щелчка по видеофайлу, когда он закончен, я хочу, чтобы файл был перемещен в директорию или 2, и любая содержащая папка удалялась.VLC: Переместить файл в конец

Я только хочу, чтобы это повлияло на файлы, расположенные в C:\Users\User1\Downloads, скажем %x%.

Есть 2 варианта:

  1. Если файл %x%\Training.4273865.2013.avi, он должен быть перемещен в ..\Viewed\.

  2. Если файл %x%\Showcase\SomeFile.mp4, его следует перенести в ту же папку: ..\..\Viewed\. Затем следует удалить папку Showcase. В настоящее время мне нужно закрыть VLC (чтобы закрыть дескриптор файла) до того, как Showcase (и это другое содержимое) можно удалить.

решение было бы хорошо, но я не против любого языка я могу компилировать с или подобным открытым исходным кодом компилятора.

ответ

3

Ниже приведен пример приложения C#, которое может делать то, что вы просите. Запустите его, щелкнув правой кнопкой мыши видеофайл, выбрав «Открыть с» и выбрав исполняемый файл приложения C# (вы можете установить флажок «Всегда использовать выбранную программу для открытия такого файла», чтобы сделать изменение постоянным).

static void Main(string[] args) 
{ 
    if (args.Length < 1) 
     return; 

    string vlc = @"C:\Program Files\VideoLAN\VLC\vlc.exe"; 
    string videoFile = args[0]; 
    string pathAffected = @"C:\Users\User1\Downloads"; 
    string destinationPath = System.IO.Directory.GetParent(pathAffected).FullName; 
    destinationPath = System.IO.Path.Combine(destinationPath, @"Viewed\"); 

    Process vlcProcess = new Process(); 
    vlcProcess.StartInfo.FileName = vlc; 
    vlcProcess.StartInfo.Arguments = "\"" + videoFile + "\""; 
    vlcProcess.StartInfo.Arguments += " --play-and-exit"; 
    vlcProcess.Start(); 
    vlcProcess.WaitForExit(); 

    if (videoFile.IndexOf(pathAffected, 
     StringComparison.InvariantCultureIgnoreCase) >= 0) 
    { 
     System.IO.File.Move(videoFile, 
      System.IO.Path.Combine(destinationPath, 
      System.IO.Path.GetFileName(videoFile))); 

     if (IsSubfolder(pathAffected, 
      System.IO.Path.GetDirectoryName(videoFile))) 
     { 
      System.IO.Directory.Delete(
       System.IO.Directory.GetParent(videoFile).FullName, true); 
     } 
    } 

} 

Я нашел код IsSubfolder в this question.

+0

Спасибо за отличный ответ, я наградил вас щедростью! Один вопрос: есть ли способ переместить файл только в том случае, если VLC фактически воспроизвел полное видео и добровольно вышел? Как бы то ни было, если я закрываю VLC в середине видео, файл все равно перемещается. Благодарю. –

+0

Спасибо за щедрость! Я не знаю сигнала от VLC, который указывает, что он завершил все видео. Вы можете попробовать опубликовать это как отдельный вопрос и посмотреть, знает ли кто-нибудь его ответ. – endofzero

+0

Эй, я давно использую эту программу, поэтому большое спасибо за это! Только одно, когда видео находится в субдире с другими файлами, другие файлы удаляются (хорошо), но сам каталог не удаляется. Когда я пытаюсь вручную удалить его в Windows сразу после этого, я получаю проблему с файловым дескриптором. Примерно через 3-5 секунд я могу удалить subdir. Как я могу сделать ваше решение полностью? Есть ли способ дождаться выхода дескриптора в каталог? Или сначала закройте ручку? Благодаря! –

3

Вы можете написать обертку и связать ее с медиа-файлами.

Что косвенно запускает VLC, а затем перемещает файлы после его закрытия.

VLC принимает список потоков в качестве аргументов, добавляет vlc://quit в конец вашего плейлиста для автоматического выхода VLC.

Обертка, написанная на C#, была бы более гибкой, но вот быстрый пример в партии.

set VLC=C:\Program Files\VideoLAN\VLC\vlc.exe 
set FILE=Tig Notaro - Live.mp3 
start "VLC" /WAIT "%VLC%" "%FILE%" vlc://quit 
echo VLC has closed, I can move the file. 
move "%FILE%" old/ 
pause 
+0

Спасибо за ответ Уильям! Я знаю, что я сказал, что решение [tag: C#] или [tag: batch] будет хорошим, но решение [tag: C#], как вы сказали, более гибкое. Спасибо за попытку! –