RAPIException при копировании файла - PullRequest
0 голосов
/ 13 февраля 2019

Чтобы скопировать файл с компьютера под управлением Windows 10 на устройство под управлением Windows CE 5.0, я использую следующий код (который входит в состав OpenNETCF Rapi для кредитования оригинального создателя):

public void CopyFileToDevice(string LocalFileName, string RemoteFileName, bool Overwrite)
    {
        // check for connection
        CheckConnection();

        FileStream localFile;
        IntPtr remoteFile = IntPtr.Zero;

        int bytesread = 0;
        int byteswritten = 0;
        int filepos = 0;
        int create = Overwrite ? CREATE_ALWAYS : CREATE_NEW;
        byte[] buffer = new byte[(int)m_FileCopyBufferSize];  // default size 4k transfer buffer

        // create the remote file
        remoteFile = CeCreateFile(RemoteFileName, GENERIC_WRITE, 0, 0, create, FILE_ATTRIBUTE_NORMAL, 0);

        // check for success
        if (remoteFile.ToInt64() == INVALID_HANDLE_VALUE)
        {
            throw new RAPIException("Could not create remote file");
        }

        // open the local file
        localFile = new FileStream(LocalFileName, FileMode.Open, FileAccess.Read);

        // read 4k of data
        bytesread = localFile.Read(buffer, filepos, buffer.Length);
        while (bytesread > 0)
        {
            // move remote file pointer # of bytes read
            filepos += bytesread;


            // write our buffer to the remote file
            if (!Convert.ToBoolean(CeWriteFile(remoteFile, buffer, bytesread, ref byteswritten, 0)))
            { // check for success
                CeCloseHandle(remoteFile);

                throw new RAPIException("Could not write to remote file");
            }
            try
            {
                // refill the local buffer
                bytesread = localFile.Read(buffer, 0, buffer.Length);
            }
            catch (Exception)
            {
                bytesread = 0;
            }
        }

        // close the local file
        localFile.Close();

        // close the remote file
        CeCloseHandle(remoteFile);
    }    

Иногда это решение работает, но без изменения кода, файла или устройств, которые он внезапно выдает RAPIException: "Could not write to remote file". Это происходит в результате сбоя функции CeWriteFile через некоторое время.

Что может привести к этой ошибке?

...