ホームページ >バックエンド開発 >C++ >ファイルのコピー時に「別のプロセスで使用されているため、ファイルをコピーできません」というエラーを防ぐ方法

ファイルのコピー時に「別のプロセスで使用されているため、ファイルをコピーできません」というエラーを防ぐ方法

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-01 01:47:10409ブラウズ

How to Prevent

コピー前にファイルの書き込みが完了していることを確認する

複数のディレクトリ内のファイルを操作する場合、コピーを試行する前にファイルが完全に書き込まれていることを確認することが重要です。これにより、「別のプロセスで使用されているため、ファイルをコピーできません」エラーが回避されます。

提供されたコードでは、指定されたディレクトリでのファイル作成イベントを監視する FileSystemWatcher が作成されます。新しいファイルが作成されると、イベント ハンドラーはそのファイルを別のディレクトリにコピーします。ただし、大きなファイルをコピーする場合、コピーが早まってしまうために問題が発生し、前述のエラーが発生します。

これに対処するには、回避策が必要です。次のメソッドを検討してください。

メソッド 1:

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

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        // the file is unavailable because it is:
        // - still being written to
        // - being processed by another thread
        // - does not exist (has already been processed)
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }

    // file is not locked
    return false;
}

メソッド 2:

const int ERROR_SHARING_VIOLATION = 32;
const int ERROR_LOCK_VIOLATION = 33;
private bool IsFileLocked(string file)
{
    // check that problem is not in destination 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 までご連絡ください。