我有一个Windows服务,它接收带元数据的文件(FIDEF)和相应的视频文件,并使用XSLT翻译XML(FIDEF)。
我获取了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);
}
}
答案 0 :(得分:1)
您的代码存在很多问题。 getFileList
为初学者提供了不需要的内部for
循环。摆脱它。您的foreach
循环有s
,可以替换filepaths[i]
循环中的for
。另外,不要outputPath + result
创建文件路径。请改用Path.Combine(outputPath, result)
,因为Path.Combine
会为您处理目录字符。此外,您需要为getFileList
提供更好的名称,因为这不是该方法的功能。不要让你的方法名称为骗子。
我只想摆脱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.fidef
,依此类推。也许不是你想要的,但你可以做出调整。
此时你还有很多工作要做。 getMovFile
看起来好像可以像GetUniqueName
一样使用工作。你会搞清楚的。祝你好运。