1
s = Environment.GetEnvironmentVariable("UserProfile") + "\\Pictures";
            string[] photosfiles = Directory.GetFiles(t, "*.*", SearchOption.AllDirectories);
            for (int i = 0; i < s.Length; i++)
            {

                File.Copy(photosfiles[i], tempphotos + "\\" + Path.GetFileName(photosfiles[i]), true);

            }

これにより、あるディレクトリから別のディレクトリにファイルがコピーされます。FORループ内で宛先ディレクトリのサイズを常に確認したい。たとえば、最初に1つのファイルをコピーして、50MB未満が続く場合はファイルサイズを確認します。

2 番目のファイルをコピーした後のループの次の繰り返しでは、コピー先ディレクトリのサイズにある 2 つのファイルのチェックが行われ、両方のファイルのサイズが 50 MB 未満の場合は続行されます。など、50MB に達するまでループを停止します。

4

2 に答える 2

1

ファイルのコピーを開始する前にディレクトリのサイズを数え、コピーするたびに各ファイルのサイズを追加するか、各ファイルのコピー後にディレクトリのサイズを再計算することができます。後者のオプションはおそらくより正確ですが、コピーするファイルのサイズによっては効率が大幅に低下すると思います(ファイルが非常に小さい場合は、非常に多くの回数を数えることになります)。

ディレクトリのサイズを取得するには、次を使用します。

public static long DirSize(DirectoryInfo d) 
{    
    long Size = 0;    
    // Add file sizes.
    FileInfo[] fis = d.GetFiles();
    foreach (FileInfo fi in fis) 
    {      
        Size += fi.Length;    
    }
    // Add subdirectory sizes.
    DirectoryInfo[] dis = d.GetDirectories();
    foreach (DirectoryInfo di in dis) 
    {
        Size += DirSize(di);   
    }
    return(Size);  
}

ここで例として使用される関数: http://msdn.microsoft.com/en-us/library/system.io.directory(v=vs.100).aspx

したがって、コードは次のようになります。

for (int i = 0; i < photosfiles.Length; i++)
{
    FileInfo fi(photosfiles[i]);

    DirectoryInfo d = new DirectoryInfo(tempphotos);
    long dirSize = DirSize(d);

    //if copying the file would take the directory over 50MB then don't do it
    if ((dirSize + fi.length) <= 52428800)
        fi.CopyTo(tempphotos + "\\" + fi.Name)
    else
        break;
}
于 2013-08-08T08:17:59.673 に答える