2010-12-07 11 views
2

私はそれぞれに500,000以上のアイテムを持つ多数のフォルダーを持っています。私は10,000(または50,000または5,000またはユーザーが定義しているもの)のフォルダにこれらを分割したい。フォルダーごとにx個のファイルを含むフォルダー構造を作成する

明らかに私の論理には何か間違っている。現在のところ、すべてのファイルを最初のフォルダに移動するだけなので作成します。私はforeachと場所の異なる組み合わせで遊んでみましたが、運はありません。

 //Find all the files to move 
     string[] files = Directory.GetFiles(textBox1.Text, "*.*", SearchOption.TopDirectoryOnly); 
     //Use selects the number of files to go in each folder 
     long h = long.Parse(tbFilePerFolder.Text); 
     //Used later 
     long i = 0; 
     //Used later 
     long j = 0; 
     //Get the number of folders to create 
     long k = files.Count()/h; 

     //Report back the number of files found 
     lblFilesFound.Text = "Files Found: " + files.Count(); 

     //Create the necessary number of folders, plus 1 to pick up remainders 
     while (j <= k + 1) 
     { 
      Directory.CreateDirectory(textBox1.Text + @"\" + j.ToString("00000")); 
      lblFoldersCreated.Text = "Folders Created: " + j; 
      j++; 
     } 

     //Get each folder that's just been created 
     string[] folders = Directory.GetDirectories(textBox1.Text, "*.*", SearchOption.TopDirectoryOnly); 

     //For each of those folders... 
     foreach (string folder in folders) 
     { 
      //While there is less than the requested number of folders... 
      while (i <= h) 
      { 
       //Get a list of the currently existing files 
       string[] files2 = Directory.GetFiles(textBox1.Text, "*.*", SearchOption.TopDirectoryOnly); 

       //And iterate through it, moving to the defined directory 
       foreach (string file in files2) 
       { 
        File.Move(file, folder + @"\" + Path.GetFileName(file)); 
        lblFilesMoved.Text = "Files Moved: " + i; 
        i++; 
       } 
      } 
     } 

答えて

2

あなたの最も内側のループでもi < hを確認することがあります。

foreach (string file in files2) 
{ 
    File.Move(file, folder + @"\" + Path.GetFileName(file)); 
    lblFilesMoved.Text = "Files Moved: " + i; 
    i++; 
    if (i > h) 
     break; 
} 

私はまた、あなたが二回Directory.GetFiles()を呼んでいることに注意してください、そしてそれはかなり高価です。
最初のリストを再利用することを検討し、移動した後で新入社員を探すことができます。

Fx4を使用できる場合は、Directory.EnumerateFiles()があり、500kファイルのフォルダに大きな違いがあります。しかし、あなたのコードをより多く適応させる必要があります。

1

は、なぜあなたがかなっ好きはありません。この場合

int j=0; 
foreach (string filename in Directory.GetFiles(textBox1.Text, "*.*", SearchOption.TopDirectoryOnly) 
{ 
    File.Move(filename , Path.Combine(textBox1.Text + j.ToString("0000"), Path.GetFileName(file)); 
    j = (j + 1)%(k + 1); 
} 

を、連続したファイルを別のフォルダに置かれます。私はそれがあなたの場合に重要であるかどうかわかりません。次のコードを使用する必要があり、代わりに

while (i <= h) 
{ 
    string[] files2 = Directory.GetFiles(textBox1.Text, "*.*", SearchOption.TopDirectoryOnly); 
    foreach (string file in files2) 
    { 
     File.Move(file, folder + @"\" + Path.GetFileName(file)); 
     lblFilesMoved.Text = "Files Moved: " + i; 
     i++; //this will never jump out the while loop until all files moved to your folder1 
     } 
} 

:(としてあなたの元のコードに近い

1

問題あなたが持っているすべてのファイルがあなたのfolder1に移動するまで、次のコードは、whileループを飛び出すことはありませんです可能)

string[] files = Directory.GetFiles(textBox1.Text, "*.*", SearchOption.TopDirectoryOnly); 

    long h = long.Parse(tbFilePerFolder.Text); 
    long i = 0; 
    long j = 0; 
    long k = files.Count()/h; 
    lblFilesFound.Text = "Files Found: " + files.Count(); 
    while (j <= k + 1) 
      { 
       Directory.CreateDirectory(textBox1.Text + @"\" + j.ToString("00000")); 
       lblFoldersCreated.Text = "Folders Created: " + j; 
       j++; 
      } 

    string[] folders = Directory.GetDirectories(textBox1.Text, "*.*", SearchOption.TopDirectoryOnly) 

    //do you really need to search again? or maybe you can just use files instead? 
    string[] files2 = Directory.GetFiles(textBox1.Text, "*.*", SearchOption.TopDirectoryOnly); 


    ind d=0;     
    foreach (string file in files2) 
    { 
     string folder=folders[d]; 
     while (i <= h) 
     { 
      File.Move(file, folder + @"\" + Path.GetFileName(file)); 
      lblFilesMoved.Text = "Files Moved:" + i; 
      i++; 
     } 
     d++; 
     i=0; 

     } 
0

私は上のすべてのビットのために行ってしまったので、アイデアのために非常に感謝! (また、Directory.EnumerateFilesも使用しました。)ロジックが間違っていた場所を認識し、GetFilesを2回呼び出すことをやめました。

 string[] folders = Directory.GetDirectories(textBox1.Text, "*.*", SearchOption.TopDirectoryOnly); 

     long d = 0; 
     long c = 0; 
     //And iterate through it, moving to the defined directory 
     while (d <= k) 
     { 
      while (i <= h) 
      { 
       try 
       { 
        string folder = folders[d]; 
        string file = files[c]; 
        File.Move(file, folder + @"\" + Path.GetFileName(file)); 
        c++; 
        i++; 
        lblFilesMoved.Text = "Files Moved: " + i; 
       } 
       catch (Exception f) 
       { 
        MessageBox.Show(f.ToString()); 
       } 
      } 
      d++; 
      i = 0; 
関連する問題