在与ActiveSync同步时读取PDA目录的内容

时间:2010-02-24 16:55:22

标签: .net io rapi handhelddevice

我有一个项目,我需要复制在PDA中找到的文件(在我的情况下,如果有任何不同,它是MC3000)。我安装了ActiveSync,它为我创建了syncronisation文件夹就好了。但是,我希望能够不仅在其MyDocument文件夹中阅读PDA的内容,所以我不能使用它(另外它必须与20+可能的相同型号的PDA一起工作,从而制作20+目录)

有没有办法在PDA内部做一些IO,同时它停靠并与ActiveSync同步。

我可以在资源管理器中看到“移动设备”。

由于

1 个答案:

答案 0 :(得分:3)

使用RAPI。它是一个codeplex项目,为Rapi.dll和ActiveSync提供托管包装类。它允许桌面.NET应用程序与系留移动设备进行通信。包装器起源于OpenNetCF project,但现在单独管理。

您可以使用从该项目发布的整个RAPI项目DLL,或者只使用您需要的代码子集。我需要在连接时在设备上创建文件,因此我不需要性能统计信息或Rapi中包含的设备注册表内容。所以我抓住了我需要的3个源文件......

它对我有用的方式是:

  • 使用ActiveSync(DccManSink)检测移动设备连接/断开状态
  • 使用RAPI包装器将文件复制到设备,在设备上创建文件,从设备复制文件等。

private DccMan DeviceConnectionMgr;
private int AdviceCode;
private int ConnectionStatus = 1;
private System.Threading.AutoResetEvent DeviceConnectionNotification = new System.Threading.AutoResetEvent(false);


public void OnConnectionError()
{
    ConnectionStatus = -1;
    DeviceConnectionNotification.Set();
}

public void OnIpAssigned(int address)
{
    ConnectionStatus = 0;
    DeviceConnectionNotification.Set();
}


private void btnCopyToDevice_Click(object sender, EventArgs e)
{
    // copy the database (in the form of an XML file) to the connected device
    Cursor.Current = Cursors.WaitCursor;

    // register for events and wait.
    this.DeviceConnectionMgr = new DccMan();

    DccManSink deviceEvents = new DccManSink();
    deviceEvents.IPChange += new IPAddrHandler(this.OnIpAssigned);
    deviceEvents.Error += new ErrorHandler(this.OnConnectionError);
    ((IDccMan)DeviceConnectionMgr).Advise(deviceEvents, out this.AdviceCode);

    // should do this asynchronously, with a timeout; too lazy.
    this.statusLabel.Text = "Waiting for a Windows Mobile device to connect....";

    this.Update();
    Application.DoEvents();  // allow the form to update

    bool exitSynchContextBeforeWait = false;
    DeviceConnectionNotification.WaitOne(SECONDS_TO_WAIT_FOR_DEVICE * 1000, exitSynchContextBeforeWait);

    if (ConnectionStatus == 0)
    {
        this.statusLabel.Text = "The Device is now connected.";
        this.Update();
        Application.DoEvents();  // allow the form to update

        RAPI deviceConnection = new RAPI();
        deviceConnection.Connect(true, 120);  // wait up to 2 minutes until connected
        if (deviceConnection.Connected)
        {
            this.statusLabel.Text = "Copying the database file to the connected Windows Mobile device.";
            this.Update();
            Application.DoEvents();  // allow the form to update
            string destPath = "\\Storage Card\\Application Data\\MyApp\\db.xml";
            deviceConnection.CopyFileToDevice(sourceFile,
                                              destPath,
                                              true);

            this.statusLabel.Text = "Successfully copied the file to the Windows Mobile device....";
        }
        else
        {
            this.statusLabel.Text = "Oh, wait, it seems the Windows Mobile device isn't really connected? Sorry.";
        }

    }
    else
    {
        this.statusLabel.Text = "Could not copy the file because the Device does not seem to be connected.";
    }

    Cursor.Current = Cursors.Default;

}