// 声明引用的API [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] internal static extern Boolean WriteFile(SafeFileHandle lpFileName, byte[] lpBuffer, int nNumberOfbytesToWrite, ref int lpNumberOfbytesWritten, int lpOverlapped); [DllImport("rapi.dll", CharSet = CharSet.Unicode)] internal static extern int CeReadFile(IntPtr hFile, byte[] lpBuffer, int nNumberOfBytesToRead, ref int lpNumberOfBytesRead, int lpOverlapped);
我需要用C#代码从移动设备上复制jpg格式的图片到PC本地。下面是出错的地方
public int RapiCopyImageFromCE(string RemoteImagePath, string LocalImagePath) { .................................................... // 读取4K字节 do { // 读取文件 if (Convert.ToBoolean(CeReadFile(remoteFile, buffer, buffer.Length, ref bytesread, 0))) { // 写缓冲区数据到本地文件 if (!Convert.ToBoolean(WriteFile(localFile1, buffer, bytesread,ref byteswritten, 0))) { // 检查是否成功,不成功关闭文件句柄 try { CeCloseHandle(remoteFile); return 3; } catch(Exception ex) { log.Error(ex.Message); return 3; } } } } while (Convert.ToBoolean(bytesread)); ................................................... }
只能执行到WriteFile这里。我用其他格式的文件试了是能写入成功的,但是碰到jpg格式的就写入不了,请问大侠们应该怎么改?
我用Marshal.GetLastWin32Error()返回了6,找到了在读取之前的创建本地文件时就出错了。
下面是引用的方式
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] internal static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile); // 创建PC上的文件 localFile1 = CreateFile(LocalImageName, GENERIC_WRITE, 0, IntPtr.Zero, CREATE_ALWAYS, 0, IntPtr.Zero);
是不是用kernel32.dll的CreateFile方法是创建不了jpg各式的文件?
那应该用什么方法呢?
另外添上从设备上读取出来的数据,请大家看看是不是真的读取正确了,因为我怀疑读取出来的编码格式也有问题。
总之我是要用winform程序从WINCE设备上复制jpg格式文件到PC本地上。其他格式的文件都是能复制成功的,就卡在了jpg,大家有没有其他什么主意?
执行完 WriteFile后,使用 GetLastError 查看下错误代码。
因为你说写入不了,我实在是不知道是什么意思,是你根本就没读取成功才导致没有数据写入吗?
读取设备上的文件是成功的。现在发现是创建本地文件时出的错,用的是kernel32.dll的CreateFile方法,请教大侠应该怎么办呢?
@Raisa: CreateFile 跟文件类型无关,你在 CreateFile 之后,继续用 GetLastError 查看下错误代码。
@Launcher: 谢谢啦,终于解决了。原来和JPG没关系,是CreateFile不能自动创建目录,所以在创建之前目录就必须存在了,哈哈,犯二了,谢谢。