1

我有一个 Windows 服务,它获取带有元数据(FIDEF)的文件和相应的视频文件,并使用 XSLT 翻译 XML(FIDEF)。

我得到了 FIDEF 的文件目录列表,如果存在同名的视频文件,它会翻译它。这工作正常,但它是每分钟搜索一次的计时器。我正在尝试处理相同文件名进入输入目录但已经在输出目录中的情况。我只是让它将输出名称更改为 (copy) 因此如果另一个文件进入我应该得到 (copy)(copy).mov 但该服务不会以输出中已经存在的同一目录的文件名开始,它可以工作一次并且然后似乎没有拿起任何新文件。

任何帮助都会很棒,因为我尝试了一些没有好的结果。我相信它是重命名方法,但我已经把大部分代码放在了上面,以防它是清理问题或其他问题。(原谅一些名字只是尝试不同的东西)。

    private void getFileList()
    {
        //Get FILE LIST FROM Directory
        try
        {
            // Process Each String/File In Directory
            string result;
            //string filename;
             filepaths = null;
             filepaths = Directory.GetFiles(path, Filetype);

            foreach (string s in filepaths)
            {

                for (int i = 0; i < filepaths.Length; i++)
                {
                    //Result Returns Video Name
                    result = Path.GetFileNameWithoutExtension(filepaths[i]);
                    FileInfo f = new FileInfo(filepaths[i]);

                    PreformTranslation(f, outputPath + result , result);


                }
            }

        }
        catch (Exception e)
        {
            EventLog.WriteEntry("Error " + e);
        }


    }

    private void MoveVideoFiles(String Input, String Output)
    {
        File.Move(Input, Output);

    }
    private string GetUniqueName(string name)
    {


         //Original Filename
        String ValidName = name;
        //remove FIDEF from filename
        String Justname1 = Path.GetFileNameWithoutExtension(name);
        //get .mov extension 
        String Extension2 = Path.GetExtension(Justname1);
        //get filename with NO extensions
        String Justname = Path.GetFileNameWithoutExtension(Justname1);
        //get .Fidef
        String Extension = Path.GetExtension(name);
        int cnt = 0;

        //string[] FileName = Justname.Split('(');
        //string Name = FileName[0];

        while (File.Exists(ValidName)==true)
        {
            ValidName = outputPath + Justname + "(Copy)" + Extension2 + Extension;
            cnt++;

        }
        return ValidName;
    }
    private string getMovFile(string name)
    {
        String ValidName = name;
        String Ext = Path.GetExtension(name);
        String JustName = Path.GetFileNameWithoutExtension(name);

        while(File.Exists(ValidName))
        {
            ValidName = outputPath + JustName + "(Copy)" + Ext;
        }
        return ValidName;
    }



    //Preforms the translation requires XSL & FIDEF name.
    private void PreformTranslation(FileInfo FileName, String OutputFileName , String result)
    {

        string FidefName = OutputFileName + ".FIDEF";
        String CopyName;
        String copyVidName = outputPath + result;

            XslCompiledTransform myXslTransform;
            myXslTransform = new XslCompiledTransform();
            try
            {
                myXslTransform.Load(XSLname);

            }
            catch 
            {
                EventLog.WriteEntry("Error in loading XSL");
            }
            try
            {   //only process FIDEF's with corresponding Video file
                if (AllFidef == "no")
                {
                    //Check if video exists if yes,
                    if (File.Exists(path + result))
                    {
                        //Check for FIDEF File Already Existing in the Output Directory. 
                        if (File.Exists(FidefName))
                        {
                            //Get unique name
                            CopyName = GetUniqueName(FidefName);
                            copyVidName= getMovFile(copyVidName);


                            //Translate and create new FIDEF. 

                            //double checking the file is here
                            if (File.Exists(outputPath + result))
                            {
                                myXslTransform.Transform(FileName.ToString(), CopyName);
                                File.Delete(FileName.ToString());
                                MoveVideoFiles(path + result, copyVidName);

                            }
                            ////Move Video file with Corresponding Name. 

                        }


                        else
                        {  //If no duplicate file exsists in Directory just move. 
                            myXslTransform.Transform(FileName.ToString(), OutputFileName + ".FIDEF");
                            MoveVideoFiles(path + result, outputPath + result);
                        }
                    }

                    }
                else
                {
                    //Must have FIDEF extension
                    //Processes All FIDEFS and moves any video files if found. 
                    myXslTransform.Transform(FileName.ToString(), OutputFileName + ".FIDEF"); 
                    if (File.Exists(path + result))
                    {
                        MoveVideoFiles(path + result, outputPath + result);
                    }


                }
            }
            catch (Exception e)
            {
                EventLog.WriteEntry("Error Transforming " + "FILENAME = " + FileName.ToString()
                    + " OUTPUT_FILENAME = " + OutputFileName + "\r\n" +"\r\n"+  e);

            }

        }
4

1 回答 1

1

你的代码有很多问题。getFileList有初学者不需要的内部for循环。摆脱它。您的foreach循环有s,可以filepaths[i]从您的for循环中替换。另外,不要做outputPath + result文件路径。改为使用Path.Combine(outputPath, result),因为Path.Combine它会为您处理目录字符。此外,您需要为 取一个更好的名称getFileList,因为这根本不是该方法的作用。不要让你的方法名是骗子。

我会简单地摆脱MoveVideoFiles. 编译器也可能。

GetUniqueName仅当您的文件名格式为 时才有效name.mov.fidef,我假设它是。但是,您确实需要更好的变量名称,否则以后它将成为维护的夜用品。我会摆脱循环条件,但这是可选的== truewhile里面的任务while就是你的文件被覆盖的原因。你总是生成相同的名称(something(Copy).mov.fidef),据我所知,如果文件存在,我认为你会永远破坏堆栈循环。您需要修复该循环以生成新名称(不要忘记Path.Combine)。也许是这样的(注意这是未经测试的):

int copyCount = 0;
while (File.Exists(ValidName))
{
    const string CopyName = "(Copy)";
    string copyString = copyCount == 0 ? CopyName : (CopyName + "(" + copyCount + ")");
    string tempName = Justname + copyString + Extension2 + Extension;
    ValidName = Path.Combine(outputPath, tempName);
    copyCount++;
}

something(Copy).mov.fidef会为第一个副本、something(Copy)(2).mov.fidef第二个副本生成,依此类推。也许不是你想要的,但你可以做出调整。

在这一点上,你有很多事情要做。getMovFile看起来好像它可以以与 . 相同的方式使用工作GetUniqueName。你会想办法的。祝你好运。

于 2011-07-18T02:37:28.443 回答