首页 新闻 赞助 找找看

从移动设备复制图片问题

0
悬赏园豆:50 [已解决问题] 解决于 2012-09-07 09:56
// 声明引用的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,大家有没有其他什么主意?

Raisa的主页 Raisa | 初学一级 | 园豆:148
提问于:2012-09-06 16:31
< >
分享
最佳答案
0

执行完 WriteFile后,使用 GetLastError 查看下错误代码。

因为你说写入不了,我实在是不知道是什么意思,是你根本就没读取成功才导致没有数据写入吗?

收获园豆:50
Launcher | 高人七级 |园豆:45045 | 2012-09-06 16:38

读取设备上的文件是成功的。现在发现是创建本地文件时出的错,用的是kernel32.dll的CreateFile方法,请教大侠应该怎么办呢?

Raisa | 园豆:148 (初学一级) | 2012-09-07 08:47

@Raisa: CreateFile 跟文件类型无关,你在 CreateFile 之后,继续用 GetLastError 查看下错误代码。

Launcher | 园豆:45045 (高人七级) | 2012-09-07 09:20

@Launcher: 谢谢啦,终于解决了。原来和JPG没关系,是CreateFile不能自动创建目录,所以在创建之前目录就必须存在了,哈哈,犯二了,谢谢。

Raisa | 园豆:148 (初学一级) | 2012-09-07 10:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册