1

それぞれ 1 ~ 20kb のテキスト ファイルの読み取りに問題があります。フォルダには約 400,000 個のファイルがあります。各テキスト ファイルの最初の行だけを読み取るようにプログラムを制限しましたが、それでもまだ遅いです。ファイルを読み取る前に、プログラムは選択したフォルダーからファイル名を取得し、ファイル名が目的のものかどうかを確認し、最初の行を読み取って正しいかどうかを確認し、最後にファイルをどこかにコピーします。欲しいです。

class FileChoose
{
    public string chooseFolder()
    {
        FolderBrowserDialog Fld = new FolderBrowserDialog();
        Fld.ShowNewFolderButton = false;
        if (Fld.ShowDialog() == DialogResult.OK)
        {
            return Fld.SelectedPath;
        }
        return "";
    }
    public List<string> getFileName(string path)
    {
        string[] filePaths = Directory.GetFiles(@path, "*.log");
        List<string> listPath = new List<string>();
        foreach (var item in filePaths)
        {
            string[] itemSplit = item.Split('\\');
            string year = itemSplit[itemSplit.Length - 1].Substring(0, 4);
            string month = itemSplit[itemSplit.Length - 1].Substring(4, 2);
            if ((year == "2013") && (month == "08"))
            {
            //    string fileNamePDF = itemSplit[itemSplit.Length - 1];
                listPath.Add(item);
            }
        }
        return listPath;
    }
    public bool isDrawing(string drawing, string path)
    {
        string drawingRead = readLog(path);
        if (drawingRead == drawing)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public string readLog(string path)
    {
        StreamReader sr = new StreamReader(path);
        string line;
        line = sr.ReadLine();
        string checkDrawing = line.Substring(1, 8);
        return checkDrawing;
    }
}

メインクラス

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

    }
  //  public string pathGlobal = "D:\\OMT\\OMT1";
  //  public string pathGlobal2 = "D:\\OMT\\OMT2";

    public string pathGlobal = "D:\\logfileProductionline\\RD Team\\Production logfile\\Grundfos\\OMT2-1";
    public string pathGlobal2 = "D:\\logfileProductionline\\RD Team\\Production logfile\\Grundfos\\OMT3";
    List<string> listPath = new List<string>();
    List<string> listPath2 = new List<string>();
    List<string> listFile = new List<string>();
    FileChoose.FileChoose folder = new FileChoose.FileChoose();
    public string folderPath;
   // public string folderPath;
    private void button1_Click(object sender, EventArgs e)
    {
        string folderPathIN = folder.chooseFolder();
        //label1.Text = folderPathIN;
        this.folderPath = folderPathIN;
    }

    private void button2_Click(object sender, EventArgs e)
    {
  //      listPath = folder.getFileName(folderPath);
        listPath = folder.getFileName(pathGlobal);
        foreach (var item in listPath)
        {
         //   string pathFile = folderPath+item;
            bool check = folder.isDrawing("96642678", item);
            if (check)
                copyFile(item);

        }
        listPath2 = folder.getFileName(pathGlobal2);
        foreach (var item in listPath2)
        {
            //   string pathFile = folderPath+item;
            bool check = folder.isDrawing("96642678", item);
            if (check)
                copyFileSeparate(item);

        }
        MessageBox.Show("Success", "Success");
        label1.Text = "Copied files are in D:\\OMT_NEW";
    }
    public void copyFileSeparate(string item)
    {
        string[] splitItem = item.Split('\\');
        string folderName = splitItem[splitItem.Length - 1].Substring(0, 8);
        try
        {
            bool isExists = System.IO.Directory.Exists("D:\\OMTSeparate");
            if (!isExists)
                System.IO.Directory.CreateDirectory("D:\\OMTSeparate");
            isExists = System.IO.Directory.Exists("D:\\OMTSeparate\\"+folderName);
            if (!isExists)
                System.IO.Directory.CreateDirectory("D:\\OMTSeparate\\"+folderName);
            File.Copy(item, "D:\\OMTSeparate\\"+folderName+"\\" + splitItem[splitItem.Length - 1]);
        }
        catch (Exception)
        {
        }
    }
    public void copyFile(string item)
    {
        string[] splitItem = item.Split('\\');
        try
        {
            bool isExists = System.IO.Directory.Exists("D:\\OMT_NEW");
            if (!isExists)
                System.IO.Directory.CreateDirectory("D:\\OMT_NEW");
            File.Copy(item, "D:\\OMT_NEW\\" + splitItem[splitItem.Length - 1]);

        }
        catch(Exception)
        {
        }
    }
   // 
}
4

1 に答える 1

3

それはたくさんのファイルです。

ステップ 1 では、GetFiles ではなく System.IO.Directory.EnumerateFiles を使用します。次に、GetFilename が yield return を使用して IEnumerable を返すようにします。これにより、400,000 個のファイル名にスペースを割り当てる必要がなくなります。ファイルを開くにはまだ時間がかかります。オープンと読み取りをスレッド化できますが、どれだけできるか、どれだけ役立つかは、プロセッサとディスク サブシステムに大きく依存します。はるかに小さなテストケースでいくつかのテストを実行し、それを使用しておおよその所要時間を決定し、何らかの進行状況インジケーターを配置して、状況がどのように進行しているかを把握してください。何かが起こった場合に最初からやり直す必要がないように、進行状況を記録するチェックファイルをときどき作成することも役立つ場合があります。

于 2013-10-01T02:46:55.700 に答える