1

メタデータ(FIDEF)と対応するビデオファイルを含むファイルを取得し、XSLTを使用してXML(FIDEF)を変換するWindowsサービスがあります。

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]foroutputPath + resultPath.Combine(outputPath, result)Path.CombinegetFileList

私は単にを取り除くでしょうMoveVideoFiles。コンパイラもそうかもしれません。

GetUniqueNameファイル名がの形式name.mov.fidefである場合にのみ機能します。ただし、実際にはより適切な変数名が必要です。そうしないと、後でメンテナンスナイトウェアになります。ループ状態のを取り除くでしょうが、それはオプション== trueです。while内部の割り当て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.fidef2番目のコピーなどが生成されます。多分あなたが望むものではありませんが、あなたは調整をすることができます。

この時点で、やるべきことがたくさんあります。getMovFileと同じように作業を使用できるように見えますGetUniqueName。あなたはそれを理解するでしょう。幸運を。

于 2011-07-18T02:37:28.443 に答える