c # служба переименования файлов! - PullRequest
1 голос
/ 18 июля 2011

У меня есть служба Windows, которая принимает файлы с метаданными (FIDEF) и соответствующими видеофайлами и переводит XML (FIDEF) с помощью XSLT.

Я получаю список каталогов файлов для FIDEF и, если существует видеофайл с таким же именем, он переводит его. Это работает нормально, но поиск по минутам выполняется по таймеру. Я пытаюсь обработать ситуации, когда одно и то же имя файла входит в каталог ввода, но уже находится в каталоге вывода. Я просто изменил имя выходного файла на (копировать), поэтому, если в него входит другой файл, я должен получить (копировать) (копировать) .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);

            }

        }

1 Ответ

1 голос
/ 18 июля 2011

С вашим кодом много ошибок. getFileList имеет ненужную внутреннюю петлю for для начинающих. Избавиться от этого. Ваша foreach петля имеет s, которая может заменить filepaths[i] из вашей for петли. Кроме того, не делайте outputPath + result для создания путей к файлам. Вместо этого используйте Path.Combine(outputPath, result), поскольку Path.Combine обрабатывает символы каталога для вас. Кроме того, вам нужно придумать лучшее имя для getFileList, так как это совсем не то, что делает метод. Не делайте ваши методы именами лжецов.

Я бы просто избавился от MoveVideoFiles. Компилятор тоже может.

GetUniqueName работает только в том случае, если имя вашего файла имеет форму name.mov.fidef, что, как я полагаю, так и есть. Вам действительно нужны более подходящие имена переменных, иначе позже это будет ночное обслуживание. Я бы избавился от == true в условии while loop, но это необязательно. Назначение внутри 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. Вы поймете это. Удачи.

...