Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#如果部分文件名与文件夹名匹配,则将文件移动到文件夹中_C#_Regex_File_Directory_Move - Fatal编程技术网

C#如果部分文件名与文件夹名匹配,则将文件移动到文件夹中

C#如果部分文件名与文件夹名匹配,则将文件移动到文件夹中,c#,regex,file,directory,move,C#,Regex,File,Directory,Move,如果.CID文件名的一部分与目录名的一部分匹配,则我有.CID文件要移动到目录中 以下是一些示例目录: S002016-P063 // projectnumber-panelnumber S002016-P066 S002016-P067 以下是一些示例文件名: P063-1.LEFT.CID // move to S002016-P063 directory P063-10.RIGHT.CID // move to S002016-P063 directory P066-2

如果.CID文件名的一部分与目录名的一部分匹配,则我有.CID文件要移动到目录中

以下是一些示例目录:

S002016-P063    // projectnumber-panelnumber
S002016-P066
S002016-P067
以下是一些示例文件名:

P063-1.LEFT.CID    // move to S002016-P063 directory
P063-10.RIGHT.CID    // move to S002016-P063 directory
P066-2_P066-5.LEFT.CID    // move to S002016-P066 because P066 == P066
P067-12.LEFT.CID    // move to S002016-P067
P067-5_P063-2.RIGHT.CID    // leave file where it’s at because P067 != P063
现在,我将这些文件物理地移动到适当的目录中,但我假设可以使用控制台应用程序来完成。我想知道我是否需要使用正则表达式类和match方法设置一些if语句?我是新来C#的,想在开始时得到一些帮助。这是我到目前为止所拥有的。控制台应用程序基本上会列出指定目录中的目录和文件

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello and Welcome to the File Sorting Program"); // Displays Text in Quotes

        Console.WriteLine(); // Adds a Space  

        string[] fileEntries = Directory.GetDirectories(@"\\Users\none\Documents\File Sorter"); // Regex for panel number = -([A-Z0-9a-z\-]+)

        System.Console.WriteLine("Directories in the Folder: ");

        Console.WriteLine(); // Adds a Space

        foreach (string fileName in fileEntries)  
        {
            Console.WriteLine(Path.GetFileName(fileName)); // Lists the directories found in the "File Sorter" directory
        }

        Console.WriteLine(); // Adds a Space
        Console.WriteLine(); // Adds a Space

        string[] files = Directory.GetFiles(@"\\Users\none\Documents\File Sorter", "*.CID"); // Regex for panel number = ([A-Z0-9a-z\-]+)-

        System.Console.WriteLine("Files in this Folder: "); // Displays Text in Quotes

        Console.WriteLine(); // Adds a Space

        foreach (string file in files)
        {
            Console.WriteLine(System.IO.Path.GetFileNameWithoutExtension(file)); // Lists each file minus .CID found in the "File Sorter" directory
        }

        Console.WriteLine("Press any key to exit."); // Displays Text in Quotes

        System.Console.ReadKey();       
    }
}

假设您的文件夹名和文件名模式是一致的,这应该可以为您提供所需的信息:

string root = @"\\Users\none\Documents\File Sorter";

string[] directories = Directory.GetDirectories(root);
var dirRef = directories.ToDictionary(k => k.Split('-')[1], v => v);

string[] files = Directory.GetFiles(root);
foreach (var file in files)
{
    string fileName = Path.GetFileName(file);
    string projectName = null;
    foreach (Match m in Regex.Matches(fileName, "[A-Za-z0-9]+(?=-)"))
    {
        if (projectName == null)
        {
            projectName = m.Value;
        }
        else if (projectName != m.Value)
        {
            projectName = null;
            break;
        }
    }

    if (projectName == null)
    {
        Console.WriteLine("Project names in file {0} do not match.", fileName);
    }
    else if (dirRef.ContainsKey(projectName))
    {
        File.Move(file, dirRef[projectName] + "\\" + fileName);
        Console.WriteLine("File {0} moved to directory {1}.", fileName, dirRef[projectName]);
    }
    else
    {
        Console.WriteLine("Directory with project name {0} doesn't exist", projectName);
    }
}

我做了一些测试,这个代码段使用一些
Regex
处理了上面的所有情况。显然,它可以改进,但这是您工作的起点:)

var projectFolders=Directory.GetDirectories(@“Projects/”);
var fileEligibleToBeMoved=新列表();
var files=Directory.GetFiles(Directory.GetCurrentDirectory());
foreach(文件中的var文件)
{
如果(!file.Contains(“.CID”))
继续;
var fileName=Path.GetFileName(文件);
var matches=Regex.matches(文件名@“(P[a-zA-Z0-9]+)”;
if(matches.Count==0)
继续;
var isEligible=真;
var previous=string.Empty;
foreach(匹配中的匹配)
{
if(previous==string.Empty)
{
previous=match.Value;
继续;
}
如果(上一个!=match.Value)
易懂=错误;
}
如果(可识别)
fileEligibleToBeMoved.Add(文件);
}
foreach(项目文件夹中的var dir)
{
var panelTag=Regex.Match(dir,@“-\w+”).Value.Replace(“-”,”);
var filesToMove=fileEligibleToBeMoved
.Where(file=>file.Contains(panelTag))
.ToArray();
foreach(filesToMove中的var文件)
{
Move(File,string.Format(“{0}/{1}”,dir,Path.GetFileName(File));
}
}

这不是问题,您是否遇到过问题?如果是,是什么?请更具体地说,人们不会简单地完成你的代码。我只能说使用
regex
是正确的。我的代码没有遇到问题。感谢您回答我关于
regex
的问题。这将如何处理最后一个测试用例,我觉得它可能会尝试将其移动到其中一个目录,而不检查部分是否正确same@TheLethalCoder对不起,问题中的特殊情况遗漏了。看我的编辑。这太棒了。谢谢你的帮助!谢谢你,希德!这真的帮助了像我这样的人,只是学习而已。
var projectFolders = Directory.GetDirectories(@"Projects/");
var fileEligibleToBeMoved = new List<string>();

var files = Directory.GetFiles(Directory.GetCurrentDirectory());

foreach (var file in files)
{
    if (!file.Contains(".CID"))
        continue;
    var fileName = Path.GetFileName(file);
    var matches = Regex.Matches(fileName, @"(P[a-zA-Z0-9]+)");

    if (matches.Count == 0)
        continue;

    var isEligible = true;
    var previous = string.Empty;
    foreach (Match match in matches)
    {
        if(previous == string.Empty)
        {
            previous = match.Value;
            continue;
        }
        if (previous != match.Value)
            isEligible = false;
    }
    if (isEligible)
        fileEligibleToBeMoved.Add(file);                
}

foreach (var dir in projectFolders)
{
    var panelTag = Regex.Match(dir, @"-\w+").Value.Replace("-", "");                
    var filesToMove = fileEligibleToBeMoved
        .Where(file => file.Contains(panelTag))
        .ToArray();
    foreach (var file in filesToMove)
    {

        File.Move(file, string.Format("{0}/{1}", dir, Path.GetFileName(file)));
    }
}