0

私はC#を初めて使用し、既存のサードパーティプログラムの制限により、ファイルが特定の時間基準を満たしている場合にファイルを移動するプログラムを作成していると確信しています。プログラムは現在の容量で動作しますが、宛先で同じ名前のファイルをチェックし、移動するファイルの名前を変更するようにしたいので、既存のファイルが存在する場合でもプログラムはエラーになりません。同名。また、一部のfnameとtargetは、カスタムクラスGloDirで宣言され、他の関数でも使用されます。

これは機能しますが、ターゲット内のファイルをチェックしません。

DirectoryInfo sourceInfo = new DirectoryInfo(GloDir.fname); 
FileInfo[] sourceFiles = sourceInfo.GetFiles("*.zip");                  
//creates array of all files ending in .zip
DirectoryInfo destInfo = new DirectoryInfo(GloDir.target);
FileInfo[] destFiles = destInfo.GetFiles("*.zip");

if (sourceFiles.Length == 0) // check to see if files are present. if not die.
{
    return;
}

foreach (var sFileInfo in sourceFiles)
{
    string sFip = sFileInfo.ToString();                                   
    //file info to string
    string fileName = System.IO.Path.GetFileName(sFip);                    
    //get file name
    string sourceFile = System.IO.Path.Combine(GloDir.fname, fileName);   
    //Full filename and path
    string targetFile = System.IO.Path.Combine(GloDir.target, fileName);  
    //New Target and Path

    DateTime createdOn = File.GetCreationTime(sourceFile);              
    //get file creation time
    DateTime rightNow = DateTime.Now;                                   
    //Variable for this moment

    var difference = rightNow - createdOn; 
    //Different between now and creation

    var minutos = difference.TotalMinutes;
    //turn difference into minutes

    //If time between creation and now is greater than 120 minutes move file to new directory
    if (minutos >= 1)                                             
    {
        //Console.Write(minutos + "  Old   - Moving! -");               
        //debug console msg
        System.IO.File.Move(sourceFile, targetFile);
        //move file to new directory
        //System.Threading.Thread.Sleep(1555);
        //debug sleep
    }
}

ターゲット内のファイルをチェックするために、ディレクトリのファイルをチェックするIfステートメントを追加するように変更し、値を比較して機能するネストされたforeachループを追加しました。唯一の問題は、ループ内で宣言された文字列を使用しようとしたとき、またはifステートメントで以下の追加を追加してコードをコピーしたときです。また、コンソールの書き込みとスリープの一部を残して、最終的なコードには含まれないプログラム関数を監視できるようにしました。

DirectoryInfo sourceInfo = new DirectoryInfo(GloDir.fname); 
FileInfo[] sourceFiles = sourceInfo.GetFiles("*.zip");
//creates array of all files ending in .zip
DirectoryInfo destInfo = new DirectoryInfo(GloDir.target);
FileInfo[] destFiles = destInfo.GetFiles("*.zip");

if (sourceFiles.Length == 0)
// check to see if files are present. if not die.
{
    //Console.Write("no files present");
    //debug console msg
    return;
}

foreach (var sFileInfo in sourceFiles)
{
    string sFip = sFileInfo.ToString();               
    //file info to string
    string fileName = System.IO.Path.GetFileName(sFip);        
    //get file name
    if (destFiles.Length != 0)
    {
        foreach (var dFileInfo in destFiles)
        {
            string dFip = dFileInfo.ToString();  
            //file info to string
            string dfileName = System.IO.Path.GetFileName(dFip);     
            //get file name

            if (dfileName == fileName)
            {
                string newFilename = "Duplicate" + fileName;
                Console.Write(newFilename + "dup change name");
                System.Threading.Thread.Sleep(1000);
            }
            else
            {
                string newFilename = fileName;
                Console.Write(newFilename + "dest files no duplicate");
                System.Threading.Thread.Sleep(1000);
            }
        }
    }
    if (destFiles.Length == 0)
    {
        string newFilename = fileName;
    }
    string sourceFile = System.IO.Path.Combine(GloDir.fname, fileName);   
    //Full filename and path
    string targetFile = System.IO.Path.Combine(GloDir.target, newFilename);  
    //New Target and Path

    DateTime createdOn = File.GetCreationTime(sourceFile);
    //get file creation time
    DateTime rightNow = DateTime.Now;           
    //Variable for this moment

    var difference = rightNow - createdOn;
    //Different between now and creation
    var minutos = difference.TotalMinutes;
    //turn difference into minutes

    //If time between creation and now is greater than 120 minutes move file to new directory
    if (minutos >= 1)                                             
    {
        System.IO.File.Move(sourceFile, targetFile);
        //move file to new directory
    }
}

宛先ディレクトリの条件に基づいて作成する必要がある場合でも、停止してnewFilename変数が現在のコンテキストに存在しないと表示されるたび。ifステートメントとループの外側に表示されるように、文字列newFilenameを別の方法で削除する必要がありますか?これは単純な間違いか、まだ学んでいない間違いだと確信しています。これも変数スコープの問題かもしれませんが、他の変数も文字列であることを考えるとそうは思いません。もう一度、私はC#を初めて使用しますが、助けていただければ幸いです。

4

1 に答える 1

1

これは間違っています:

        if (destFiles.Length == 0)
        {
                string newFilename = fileName;
        }

newFilenameifテストにのみ存在します。

次のように置き換えます。

string newFilename = string.Empty;
if (destFiles.Length == 0)
{
    newFilename = fileName;
}

そうすれば、後でそれを使用できるようになります。

これは、コードで何度も実行しました。

変数スコープに関するこのMSDNの記事には、このトピックに関しておそらく必要となるすべての情報が含まれています。

于 2013-03-12T14:45:27.083 に答える