仅当存在具有唯一11个字符代码的所有文件时,才处理文件

时间:2019-03-21 11:16:08

标签: c#

我正在使用ERP BEXT。 BEXT生成4种文件,这些文件必须导入到服务器上。所有文件名都包含特殊的11 character代码,如下图所示。

An exemple of the 4 kind of files.

在导入之前,文件。我需要检查4个文件是否存在。

我考虑过使用方法GetFileNameWithoutExtension并使用方法Substring来获取4个文件名,但是我有点迷失了。因为您不能在表上使用Substring

string[] txt = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt").Select(Path.GetFileNameWithoutExtension).ToArray();
string[] top = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt").Select(Path.GetFileNameWithoutExtension).ToArray();

for (int i = 0; i < txt.Length;i++)
{
    i++;

    Console.WriteLine("Fichier de Type 1 : " + txt[i - 2]);

    for (int j = 0; j < top.Length; j++)
    {
        j++;
        Console.WriteLine("Fichier Type 2 :" + top[j - 1]);

        if (txt[i - 1] == top[j - 1])
        {
            System.Diagnostics.Process.Start("//ALICE/interface.exe");
            //The Batch sort the files, without issue.
        }
        else
        {
            //No matc exiting the P.
        }
    }
}
Console.ReadLine();

任何帮助将不胜感激。

感谢阅读。

4 个答案:

答案 0 :(得分:2)

以下代码将为您提供一个词典,其中的键是文件ID,值是它在目录中遇到该FileID的次数。

    public string ExtractIDFromFileName(string filename)
    {
        return filename.Split('_').Last();
    }

    public Dictionary<string,int> GetDictOfIDCounts()
    {
        List<string> allfiles = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt").Select(Path.GetFileNameWithoutExtension).ToList();
        allfiles.AddRange(Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.top").Select(Path.GetFileNameWithoutExtension).ToList());
        Dictionary<string, int> dict = new Dictionary<string, int>();

        foreach(var x in allfiles)
        {
            string fileID = ExtractIDFromFileName(x);
            if (dict.ContainsKey(fileID))
            {
                dict[fileID]++;
            }
            else
            {
                dict.Add(fileID, 1);
            }
        }
        return dict;
    }

所有您需要做的就是检查是否实际找到了您需要的ID 4次,并且这些ID是您导入的ID。

答案 1 :(得分:1)

您可以使用Contains()方法来检查文件名是否包含您要查找的字符串:

 string[] txt = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt")
.Select(x => Path.GetFileNameWithoutExtension(x))
.Where(x => x.Contains("BP011910513")).ToArray();

或者,如果您想获取所有名称不带扩展名以给定字符串结尾的文件:

 string[] txt = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt")
.Select(x => Path.GetFileNameWithoutExtension(x))
.Where(x => x.EndsWith("_BP011910513")).ToArray();

要获取11个字符的ID:

 string[] IDs = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt")
.Select(x => Path.GetFileNameWithoutExtension(x).Split("_").Last())
.Where(x => x.Length == 11).ToArray();

或者:

     string[] IDs = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt")
    .Select(x => { 
var name = Path.GetFileNameWithoutExtension(x);
return name.Length >= 11; name.SubString(name.Length-11): "";
}).Where(x => x.Length == 11).ToArray();

答案 2 :(得分:1)

LINQ是解决此类问题的好方法

var groupedFiles = from f in Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.t*")
                    let match = Regex.Match(f, @"([a-zA-Z0-9]{11})(?:\.top|\.txt)$")
                    where match.Success
                    let groupKey = match.Groups[1].Value
                    group f by groupKey into fileGroupItem
                    let fileGroup = fileGroupItem.ToArray()
                    where fileGroup.Length == 4
                    select new { GroupKey = fileGroupItem.Key, FileGroup = fileGroup };

如果获取Directory.GetFiles会带来很多不需要的文件并降低性能,则可以适当地调整*.t*来获取所有相关文件。

让我解释一下该查询,我们获取所有相关文件并与正则表达式进行匹配,以找出所有文件组的11位字母数字``groupKey . Now we group the files using this key and eliminate all groups which do not have exactly 4 items. This gives us groupedFiles which is an IEnumerable`拥有全部4个文件。

Regex,可以在将来为您提供灵活性,并且LINQ查询可以轻松扩展以添加更多处理。

我之所以会寻求这种解决方案的最大原因是其可读性。

答案 3 :(得分:0)

获取ID并计算迭代次数的简单方法。

static void Main(string[] args)
    {
        int w = 0;
        int zig = 0;
        string[] IDs = Directory.GetFiles("C:/Users/ngallouj/Desktop/Script/test", "*.txt")
        .Select(x => Path.GetFileNameWithoutExtension(x).Split('_').Last())
        .Where(x => x.Length == 11).ToArray();

        for (int i = 0; i < IDs.Length; i++)
        {
            i++;
            Console.WriteLine("" + IDs[i - 1]);

            if (IDs[w] != IDs[i-1])
            {
                w++;

            }else

            {
                zig++;
                if (zig == 4)

{

                    Console.WriteLine("l'idée ci-dessous apparait : 4 fois");
                    Console.ReadLine();
                }
            } 

        }