正则表达式;根据文件名匹配文件夹位置移动文件
本文关键字:文件夹 位置 移动 文件 文件名 正则表达式 | 更新日期: 2023-09-27 18:15:46
我知道如何根据Regex的特定命名模式匹配文件名,我想将文件移动到目录中具有文件名匹配细节的特定文件夹中。例如
reportONE14073012300000.xls
一般格式为:
(Filename'YYMMDD'HRS'MM'SS.xls)
此文件位于临时位置A:temp
中,但需要转到
A:'Report'2014'ONE'July'30'1200'0030
一般格式为:
(A:'Report'2014'ONE'MM'DD'HH'MM)
下面的代码片段将解析输入文本并将其转换为期望的路径。
string name = "reportONE14073012300000";
var match = Regex.Match(name, @"(?i)[a-z]+('d{14})");
if(match.Success)
{
DateTime dt = DateTime.ParseExact(match.Groups[1].Value,"yyMMddHHmmssff",CultureInfo.InvariantCulture);
string path = string.Format(@"A:'Report'{0}'ONE'{1}'{2}'{3}'{4}",
dt.ToString("yyyy"),
dt.ToString("MMMM"),
dt.ToString("dd"),
dt.ToString("HH00"),
dt.ToString("mm00"));
Console.WriteLine(path);// A:'Report'2014'ONE'July'30'1200'0030
}
我把移动文件部分留给你自己,试试吧
像这样的东西应该对你有用。它没有经过测试,但是,除了移动文件之外,它还需要解析文件名并在运行时创建整个存档目录树。
方法Archive()
返回一个bool值,指示指定的文件是否被移动。
你可能需要调整正则表达式,因为它是基于我对文件名格式可能不正确的理解。
private static void ArchiveAll( DirectoryInfo dropDirectory , DirectoryInfo archiveRoot )
{
foreach ( FileInfo file in dropDirectory.EnumerateFiles("*.xls") )
{
Archive( file , archiveRoot ) ;
}
}
private static bool Archive( FileInfo file , DirectoryInfo archiveRoot )
{
bool wasArchived = false ;
Match m = rxFileNamePattern.Match(file.Name) ;
if ( m.Success )
{
string pfx = m.Groups["prefix"].Value ;
string sfx = m.Groups["suffix"].Value ;
string dtRaw = m.Groups["timestamp"].Value ;
DateTime dt = DateTime.ParseExact( dtRaw , "yyMMddHHmm" , CultureInfo.CurrentCulture ) ;
string path = Path.Combine( "." ,
pfx ,
dt.ToString( "yyyy" ) ,
sfx ,
dt.ToString( "MMMM" ) ,
dt.ToString( "dd" ) ,
dt.ToString( "HH00" ) ,
dt.ToString( "00mm" )
) ;
DirectoryInfo archive = archiveRoot.CreateSubdirectory( path ) ;
file.MoveTo( Path.Combine( archive.FullName , file.Name ) ) ;
wasArchived = true ;
}
return wasArchived ;
}
const string fnPattern = @"
^ # - start of text, followed by
(?<prefix> 'p{Ll}+) # - prefix : 1 or more lowercase letters, followed by
(?<suffix> 'p{Lu}+ ) # - suffix : 1 or more uppercase letters, followed by
(?<timestamp> 'd{10} ) # - timestamp : 10 decimal digits in the form YYMMDDhhmm, followed by
(?<seconds> 'd{4} ) # - seconds : 4 decimal digits
(?<ext> '.xls ) # - ext : the literal '.xls'
$ # - end of text.
" ;
const RegexOptions fnPatternOptions = RegexOptions.IgnoreCase
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.ExplicitCapture
;
static readonly Regex rxFileNamePattern = new Regex( fnPattern , fnPatternOptions ) ;