-5

プログラムはファイルパスを設定することを意図しており、データが設定されたら、この関数を使用する必要があります。

    public void SendFile(String fileName, long fileSize, NetworkStream io)
    {
        SendFileNameToServer();
        SendFileSizeToServer();

        byte[] fileData;

        try
        {
            if (!File.Exists(fileName))
            {
                throw new FileNotFoundException("File does not exist!");
            }
            FileStream openFileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            BinaryReader bReader = new BinaryReader(openFileStream);

            Int32 remainingSize = Convert.ToInt32(_fileSize);


            do
            {
                fileData = bReader.ReadBytes(BUFSIZE);
                io.Write(fileData, 0, BUFSIZE);
                remainingSize -= BUFSIZE;
            } while (remainingSize > BUFSIZE);

            do
            {
                fileData = bReader.ReadBytes(remainingSize);
                io.Write(fileData, 0, remainingSize);
                remainingSize -= remainingSize;
            } while (remainingSize > 0);

            bReader.Close();
            openFileStream.Flush();
            openFileStream.Close();
            io.Flush();
            io.Close();
        }
        catch (Exception)
        {
            throw new Exception();
        }
    }

ファイルパスで指定されたファイルを、ファイルデータを受信するサーバー側プログラムに送信します。

問題は、その行FileStream openFileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);に到達すると、ファイルが見つからないことが通知されることです。例外はありException:Thrown: "The process cannot access the file 'D:\StepMania\Songs\Fragma\You Are Alive\Green.avi' because it is being used by another process." (System.IO.IOException) A System.IO.IOException was thrown: "The process cannot access the file 'D:\*FilePath*\Green.avi' because it is being used by another process." Time: 04-05-2013 21:11:39 Thread:Main Thread[5532]ますが、StepMania が実行されていないときにこのファイルを使用するプロセスは考えられません。ファイルパスを確認したので、ファイルがそこにあることがわかりました。ファイルはあるべき場所にあります。ファイルがプログラムとまったく同じフォルダーにある場合は問題なく動作しますが、それ以外は、この問題の解決策が見つからないようです。何が間違っている可能性があるかについて誰か考えがありますか?

私のコードがさらに必要な場合は、教えてください。

編集: 私のサーバーはこのコードを使用してファイルを受信します:

    public void ReceiveFile(String fileName, NetworkStream io)
    {
        // TO DO Din egen kode
        byte[] fileData = new byte[BUFSIZE];

        FileStream writeFileStream = new FileStream(fileName, FileMode.Create);
        BinaryWriter bWrite = new BinaryWriter(writeFileStream);

        int bytesRead = 0;
        long remainingSize = Convert.ToInt32(_fileSize);

        do
        {
            Console.WriteLine("Remaining number of bytes: {0}", remainingSize);
            bytesRead = io.Read(fileData, 0, BUFSIZE); // Read max 1000 bytes from server via socket (actual value is placed in "bytesRead"
            bWrite.Write(fileData, 0, bytesRead); // write the received bytes into file. the number of received bytes is placed in "bytesRead"
            remainingSize -= bytesRead;
        }
        while (remainingSize > 0);

        writeFileStream.Flush();
        writeFileStream.Close();
        bWrite.Close();
    }
4

1 に答える 1

0

OK、問題が見つかりました。サーバー側のプログラムがクライアント側のプログラムに干渉しました。クライアント プログラムの SendFile コードの固定コードは次のとおりです。

public void SendFile(String fileName, long fileSize, NetworkStream io)
    {
        SendFileNameToServer();
        SendFileSizeToServer();

        byte[] fileData;

        try
        {
            FileStream openFileStream = File.OpenRead(fileName);
            BinaryReader bReader = new BinaryReader(openFileStream);

            Int32 remainingSize = Convert.ToInt32(_fileSize);


            do
            {
                fileData = bReader.ReadBytes(BUFSIZE);
                io.Write(fileData, 0, BUFSIZE);
                remainingSize -= BUFSIZE;
            } while (remainingSize > BUFSIZE);

            do
            {
                fileData = bReader.ReadBytes(remainingSize);
                io.Write(fileData, 0, remainingSize);
                remainingSize -= remainingSize;
            } while (remainingSize > 0);

            openFileStream.Flush();
            bReader.Close();
            openFileStream.Close();
            io.Flush();
            io.Close();
        }
        catch (Exception)
        {
            throw new Exception();
        }
    }

私のサーバーのReceiveFileコードは次のとおりです。

public void ReceiveFile(String fileName, NetworkStream io)
    {
        // TO DO Din egen kode
        byte[] fileData = new byte[BUFSIZE];

        FileStream writeFileStream = new FileStream(LIB.extractFileName(fileName), FileMode.Create);
        BinaryWriter bWrite = new BinaryWriter(writeFileStream);

        int bytesRead = 0;
        long remainingSize = Convert.ToInt32(_fileSize);

        do
        {
            Console.WriteLine("Remaining number of bytes: {0}", remainingSize);
            bytesRead = io.Read(fileData, 0, BUFSIZE); // Read max 1000 bytes from server via socket (actual value is placed in "bytesRead"
            bWrite.Write(fileData, 0, bytesRead); // write the received bytes into file. the number of received bytes is placed in "bytesRead"
            remainingSize -= bytesRead;
        }
        while (remainingSize > 0);

        writeFileStream.Flush();
        writeFileStream.Close();
        bWrite.Close();
    }

繰り返しますが、私の投稿に返信してくれた皆さんに感謝します!

于 2013-05-05T08:37:21.030 に答える