Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# VLC:端部移动文件_C#_Visual Studio 2012_.net_Vlc_Libvlc_Vlcj - Fatal编程技术网

C# VLC:端部移动文件

C# VLC:端部移动文件,c#,visual-studio-2012,.net,vlc,libvlc,vlcj,C#,Visual Studio 2012,.net,Vlc,Libvlc,Vlcj,在Windows中,双击一个视频文件后,当它完成时,我希望该文件向上移动一个dir或2,并删除任何包含该文件的文件夹 我只希望这会影响位于C:\Users\User1\Downloads,例如%x%中的文件 有两种情况: 如果文件是%x%\Training.4273865.2013.avi,则应将其移动到。\view\ 如果文件是%x%\Showcase\SomeFile.mp4,则应将其移动到同一文件夹:。\..\viewsed\。然后应删除Showcase文件夹。目前,我必须先关闭VLC(以

在Windows中,双击一个视频文件后,当它完成时,我希望该文件向上移动一个dir或2,并删除任何包含该文件的文件夹

我只希望这会影响位于
C:\Users\User1\Downloads
,例如
%x%
中的文件

有两种情况:

  • 如果文件是
    %x%\Training.4273865.2013.avi
    ,则应将其移动到
    。\view\

  • 如果文件是
    %x%\Showcase\SomeFile.mp4
    ,则应将其移动到同一文件夹:
    。\..\viewsed\
    。然后应删除Showcase文件夹。目前,我必须先关闭VLC(以关闭文件句柄),然后才能删除
    Showcase
    (及其其他内容)


  • 一个解决方案会很好,但我不介意使用任何语言或类似的开源编译器进行编译。

    您可以编写一个包装器,并将其与媒体文件关联起来

    这将间接启动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
    
    下面是一个示例C#应用程序,它可以满足您的要求。右键单击视频文件,选择“打开方式”,然后选择C#应用程序的可执行文件(您可以选中“始终使用所选程序打开此类文件”复选框,以使更改永久化),从而启动该程序

    static void Main(字符串[]args)
    {
    如果(参数长度<1)
    返回;
    字符串vlc=@“C:\ProgramFiles\VideoLAN\vlc\vlc.exe”;
    字符串videoFile=args[0];
    字符串PathInfected=@“C:\Users\User1\Downloads”;
    字符串destinationPath=System.IO.Directory.GetParent(PathInfected).FullName;
    destinationPath=System.IO.Path.Combine(destinationPath,@“已查看\”);
    流程vlcProcess=新流程();
    vlcProcess.StartInfo.FileName=vlc;
    vlcProcess.StartInfo.Arguments=“\”“+videoFile+”\”;
    vlcProcess.StartInfo.Arguments+=“--播放并退出”;
    vlcProcess.Start();
    vlcProcess.WaitForExit();
    如果(videoFile.IndexOf)(路径受影响,
    StringComparison.InvariantCultureInogoreCase)>=0)
    {
    System.IO.File.Move(视频文件,
    System.IO.Path.Combine(目标路径,
    System.IO.Path.GetFileName(videoFile));
    如果(IsubFolder)(路径受影响,
    System.IO.Path.GetDirectoryName(视频文件)))
    {
    System.IO.Directory.Delete(
    System.IO.Directory.GetParent(videoFile.FullName,true);
    }
    }
    }
    

    我在中找到了
    IsSubfolder
    的代码。

    谢谢您的回答!我知道我说过一个或多个解决方案是好的,但正如你所说,这个解决方案更灵活。谢谢你的努力!谢谢你的回答,我已经给你赏金了!一个问题:如果VLC真的播放了完整的视频并自愿退出,是否有办法只移动文件?事实上,如果我在视频中间关闭VLC,文件无论如何都会被移动。谢谢,谢谢你的赏金!我不知道VLC发出的信号表明它完成了整个视频。你可以试着把它作为一个单独的问题发布,看看有没有人知道答案。嘿,我最近一直在使用这个程序,所以非常感谢!只有一件事,当视频与其他文件在子目录中时,其他文件会被删除(很好),但目录本身不会被删除。当我尝试直接在Windows中手动删除它时,我遇到了一个文件句柄问题。大约3-5秒后,我可以删除子目录。我如何才能使您的解决方案充分发挥作用?有没有办法等待dir上的句柄被释放?还是先关上把手?谢谢
    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);
            }
        }
    
    }