【问题标题】:c# service renaming files!c#服务重命名文件!
【发布时间】:2011-10-07 08:37:37
【问题描述】:

我有一个 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);

            }

        }

【问题讨论】:

  • 为什么有内部for 循环?它基本上复制了foreach

标签: c# windows-services renaming


【解决方案1】:

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

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

GetUniqueName 仅在您的文件名格式为name.mov.fidef 时才有效,我假设是这样。不过,您确实需要更好的变量名称,否则它将成为以后的维护夜件。我会在while 循环条件中去掉== true,但这是可选的。 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 相同的方式使用工作。你会想办法的。祝你好运。

【讨论】:

  • 是的,您的代码运行良好! (将 copyString 添加到 tempName),感谢您对更改和提示的帮助!真的很有帮助,应该尽量不要学习坏习惯。 :)
猜你喜欢
  • 1970-01-01
  • 2011-01-07
  • 2012-02-18
  • 2019-05-09
  • 1970-01-01
  • 2016-05-22
  • 2011-08-19
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多