4

なぜ私がそのようなエラーを持っているのか教えてください....

2013-08-11 18:44:28 - NPMessage: DEBUG: Dispatching a RPCStorageWriteUserFileMessage
2013-08-11 18:44:28 - RPCStorageWriteUserFileMessage: INFO: Got a request for writing 8192 bytes to file iw4.stat for user alhpons.
2013-08-11 18:44:28 - ProfileData: INFO: Handling profile update request for alhpons
2013-08-11 18:44:28 - ProfileData: ERROR: Exception: System.IO.IOException: The process cannot access the file 'D:\IW4M\NpServer\data\priv2\00\000\alhpons\iw4.stat' because it is being used by another process.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
   at System.IO.File.ReadAllBytes(String path)
   at NPx.ProfileData.Handle(UpdateRequest request)
   at NPx.ProfileData.Run()

編集:

私はWindows Server 2008でアプリを使用しており、一部のファイルにはアプリケーションの読み取り/書き込み許可が必要ですが、そのようなエラーがあるため、その問題を修正する必要があり、ソースは次のとおりです。

public override void Process(NPHandler client)
    {
        var fileName = Message.fileName;
        var fileData = Message.fileData;
        var npid = (long)Message.npid;
        var fsFile = StorageUtils.GetFilename(fileName, npid);

        _client = client;
        _fileName = fileName;
        _npid = npid;

        if (!client.Authenticated)
        {
            ReplyWithError(1);
            return;
        }

        if (client.NPID != (long)npid)
        {
            ReplyWithError(1);
            return;
        }

        if (!Directory.Exists(Path.GetDirectoryName(fsFile)))
        {
            Directory.CreateDirectory(Path.GetDirectoryName(fsFile));
        }

        // are we allowed to write this type of file?
        if (!_fileHooks.ContainsKey(fileName))
        {
            ReplyWithError(1);
            return;
        }

        string backupFile = null;

        int result = _fileHooks[fileName](fileData, fsFile, out backupFile);

        if (result > 0)
        {
            ReplyWithError(result);
            return;
        }

        Log.Info(string.Format("Got a request for writing {0} bytes to file {1} for user {2}.", fileData.Length, fileName, npid.ToString("X16")));

        try
        {
            var stream = File.Open(fsFile, FileMode.Create, FileAccess.Write);

            stream.BeginWrite(fileData, 0, fileData.Length, WriteCompleted, stream);

            if (backupFile != null)
            {
                var backupStream = File.Open(backupFile, FileMode.Create, FileAccess.Write);

                backupStream.BeginWrite(fileData, 0, fileData.Length, BackupWriteCompleted, backupStream);
            }
        }
        catch (Exception ex)
        {
            Log.Error(ex.ToString());
            ReplyWithError(2);
        }
    }
4

2 に答える 2

4

はい、このメッセージを表示するプログラムそのものが、ファイルをロックしているプログラムである可能性があります。使用後は各データ ストリームを閉じて、適切なハウスキーピングを実践してください。

于 2014-03-12T19:47:55.423 に答える
1
  var stream = File.Open(fsFile, FileMode.Create, FileAccess.Write);

このストリームをどこで閉じますか?

別のプロセスで使用されているため、プロセスはファイル xxx にアクセスできません。

このメッセージを書いたマイクロソフトのプログラマーは、信頼できる魂でした。彼はあなたが間違っていると思いたくなかった. ただし、コードをデバッグしているとき、そのメッセージは「プロセスによって使用されています」で終わっているはずです。それはあなた自身のものを含みます。

また、 backupStreamで同じ間違いを犯したことにも注意してください。既に File.ReadAllBytes() を使用してファイルを読み取っているので、File.WriteAllBytes() を使用して書き込むこともできます。遅延を許容できない場合は、WriteCompeted コールバック メソッドで閉じていることを確認する必要があります。

すでにこれを行っている場合は、ファイルが実際に別のプロセスで使用されている可能性があることを考慮してください。それ起こります。

于 2013-08-11T15:32:07.690 に答える