ホームページ >バックエンド開発 >C++ >ファイルをコピーする前にファイルが完全に書き込まれたことを確認するにはどうすればよいですか?

ファイルをコピーする前にファイルが完全に書き込まれたことを確認するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-05 12:07:41390ブラウズ

How to Ensure a File Is Completely Written Before Copying It?

ファイルの書き込みが完了するまで待つ

監視対象のディレクトリにファイルが作成されると、一般的なタスクはそれを別のディレクトリにコピーすることです位置。ただし、大規模なファイル転送では、コピー プロセスが開始される前にファイルが完全に書き込まれていないためにエラーが発生する可能性があります。

この問題に対処するには、コピー前にファイルのステータスを確認する回避策が必要です。 1 つの方法は IsFileLocked 関数を使用することです。この関数は、ファイルがまだ書き込み中または別のスレッドによって処理中の場合に True を返します。以下に例を示します:

private bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }

    return false;
}

このコードは FileSystemWatcher_Created イベント ハンドラーに組み込むことができます:

public static void listener_Created(object sender, FileSystemEventArgs e)
{
    while (IsFileLocked(new FileInfo(e.FullPath)))
    {
        // Wait for file to finish writing
    }

    File.Copy(e.FullPath, @"D:\levan\FolderListenerTest\CopiedFilesFolder\" + e.Name);
}

または、次のメソッドを使用できます:

const int ERROR_SHARING_VIOLATION = 32;
const int ERROR_LOCK_VIOLATION = 33;
private bool IsFileLocked(string file)
{
    if (File.Exists(file) == true)
    {
        FileStream stream = null;
        try
        {
            stream = File.Open(file, FileMode.Open, FileAccess.ReadWrite, FileShare.None);
        }
        catch (Exception ex2)
        {
            int errorCode = Marshal.GetHRForException(ex2) & ((1 << 16) - 1);
            if ((ex2 is IOException) && (errorCode == ERROR_SHARING_VIOLATION || errorCode == ERROR_LOCK_VIOLATION))
            {
                return true;
            }
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }
    }

    return false;
}

以上がファイルをコピーする前にファイルが完全に書き込まれたことを確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。