手持设备文件管理及同步解决方案

在处理手持设备与桌面应用程序之间的文件同步问题时,遇到了一些挑战。过去,依赖于Microsoft ActiveSync进行文件同步,但这种方法有时会导致文件损坏。为了解决这一问题,探索了一种新的方法,即直接从手持设备复制文件到桌面,而不是进行复杂的同步操作。

使用的是.NET Compact Framework2.0,并且有一个桌面应用程序,用于管理从手持设备发送的文件,并通过B2B服务进行传输。面临的一个独特需求是,需要在本地工作文件夹和手持设备上的同步文件之间进行二次同步。

问题的发现

在考虑如何解决这些同步冲突时,意识到实际上并不需要同步文件,只需要复制它们。由于软件设计方式,手持设备上会创建各种XML文件,然后桌面软件会处理这些XML文件,有时还会调整数据,最后生成数据文件并通过B2B服务传输。

探索解决方案

开始了新的尝试,直接从手持设备获取文件。对于这个新手来说,这方面的信息很难找到,这也是写这篇文章的原因。请注意,以下代码仅在Windows Mobile 5设备上进行了测试。

资源搜索

在Google、CodeProject和OpenNetCF等网站上寻找信息时,发现找到关于从桌面应用程序管理手持设备文件的资料并不容易。需要能够枚举手持设备上的整个目录结构。

OpenNetCF的发现

偶然发现了OpenNetCF,他们提供了一个名为OpenNETCF.Desktop.Communication.dll的开源DLL,这个DLL可以帮助与手持设备进行交互。尽管这个DLL非常有用,但发现它有点难以使用。决定编写一个包装类,以简化需要执行的所有手持设备文件操作。

OpenNETCF.Desktop.Communication Assembly

RAPI(Remote API)通过OpenNETCF.Desktop.Communication.dll使能够与手持设备进行操作。将简要介绍这个程序集中的一些方法和属性。

这个属性返回一个布尔值,如果设备连接到计算机则为true。

在操作设备之前,必须通过RAPI连接到设备。完成操作后,应该断开连接。

C# RAPI rapi = new RAPI(); rapi.Connect(); rapi.Disconnect();

FileList RAPI.EnumFiles(string fileName)允许从手持设备获取文件和目录。string fileName参数有点令人困惑。以下是可以传递给RAPI.EnumFiles方法的有效字符串参数:

  • My Documents\Folder1\ - 返回FileList数组中的一个项目,Folder1。
  • My Documents\Folder1\* - 返回Folder1中的所有文件和目录。
  • My Documents\Folder1\*xml - 返回Folder1中的所有XML文件。
  • My Documents\Folder1\123.xml - 返回FileList数组中的一个项目,123.xml。

HHFiles.cs

public FileList MyDocuments { get { return rapi.EnumFiles("My Documents"); } } public void CopyFileFromDevice(string localFilePath, string deviceFilePath, bool overwrite) { Rapi.CopyFileFromDevice(localFilePath, deviceFilePath, overwrite); } public void DeleteFile(string deviceFilePath) { if (Rapi.DeviceFileExists(deviceFilePath)) { Rapi.DeleteDeviceFile(deviceFilePath); } } public void CopyFilesFromDevice(string localStartingDirectory, string deviceStartingDirectory, string fileMask, bool includeSubDirectories, bool overwrite) { CreateLocalStartingDirectory(localStartingDirectory); FileList deviceDirectory = GetFileList(deviceStartingDirectory); if (deviceDirectory == null || deviceDirectory.Count != 1) { throw new System.IO.FileNotFoundException("Invalid Device Directory", deviceStartingDirectory); } FileList directoryList = GetFileList(deviceStartingDirectory + "\\*"); foreach (FileInformation dirInfo in directoryList) { if (dirInfo.FileAttributes == (int)FileAttributes.Directory) { if (!includeSubDirectories) continue; string newDeviceDirectory = deviceStartingDirectory + "\\" + dirInfo.FileName; string newLocalDirectory = localStartingDirectory + "\\" + dirInfo.FileName; CopyFilesFromDevice(newLocalDirectory, newDeviceDirectory, fileMask, includeSubDirectories, overwrite); } else { if (!MatchesFileMask(dirInfo.FileName, fileMask)) continue; string newDeviceFile = deviceStartingDirectory + "\\" + dirInfo.FileName; string newLocalFile = localStartingDirectory + "\\" + dirInfo.FileName; CopyFileFromDevice(newLocalFile, newDeviceFile, overwrite); } } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485