在处理手持设备与桌面应用程序之间的文件同步问题时,遇到了一些挑战。过去,依赖于Microsoft ActiveSync进行文件同步,但这种方法有时会导致文件损坏。为了解决这一问题,探索了一种新的方法,即直接从手持设备复制文件到桌面,而不是进行复杂的同步操作。
使用的是.NET Compact Framework2.0,并且有一个桌面应用程序,用于管理从手持设备发送的文件,并通过B2B服务进行传输。面临的一个独特需求是,需要在本地工作文件夹和手持设备上的同步文件之间进行二次同步。
在考虑如何解决这些同步冲突时,意识到实际上并不需要同步文件,只需要复制它们。由于软件设计方式,手持设备上会创建各种XML文件,然后桌面软件会处理这些XML文件,有时还会调整数据,最后生成数据文件并通过B2B服务传输。
开始了新的尝试,直接从手持设备获取文件。对于这个新手来说,这方面的信息很难找到,这也是写这篇文章的原因。请注意,以下代码仅在Windows Mobile 5设备上进行了测试。
在Google、CodeProject和OpenNetCF等网站上寻找信息时,发现找到关于从桌面应用程序管理手持设备文件的资料并不容易。需要能够枚举手持设备上的整个目录结构。
偶然发现了OpenNetCF,他们提供了一个名为OpenNETCF.Desktop.Communication.dll的开源DLL,这个DLL可以帮助与手持设备进行交互。尽管这个DLL非常有用,但发现它有点难以使用。决定编写一个包装类,以简化需要执行的所有手持设备文件操作。
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方法的有效字符串参数:
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);
}
}
}