1. 程式人生 > >用OpenNETCF進行檔案(資料)同步

用OpenNETCF進行檔案(資料)同步

大家好,目前資料同步的方式有好幾種,本文主要是以檔案同步的方式同步資料,思路如下:將mobile sql 的sdf格式的資料庫在PC上配置好(當然是用程式碼去操作了)以後,通過OpenNETCF提供的方法,同步到PDA,俗一點說,就是把帶有資料的sdf資料庫拷貝到PDA上,然後,您PDA上程式就可以對該sdf資料庫進行一系列操作了,相反,也可以把PDA上的sdf資料庫同步到PC,用PC上的程式對sdf資料庫進行操作。 本文說明如何通過一個簡單的桌面應用程式充分利用遠端 API 執行以下操作:

[注]一下程式碼均運行於PC端。

1.通過裝置複製貼上檔案。

2.移動裝置中的檔案。

3.刪除裝置中的檔案。

我們需要用到OpenNETCF.Desktop.Communication.DLL 相關dll請到其官方網站下載

下面是對該dll中方法的一些說明

Connect  建立與裝置的同步連線。

 CopyFileFromDevice 將裝置中的檔案複製到 PC。

CopyFileOnDevice 將裝置某個位置的檔案複製到裝置的另一新位置。

CopyFileToDevice 將 PC 中的檔案複製到裝置。

CreateDeviceDirectory 在裝置中建立目錄。

CreateProcess 啟動裝置中的應用程式。

DeleteDeviceFile 刪除裝置中的檔案。

DeviceFileExists 檢查裝置中是否存在檔案。

Disconnect  中斷與裝置的連線。

EnumFiles  提供與 FileName 引數提供的條件相匹配的FileInformation 類陣列列表。

GetDeviceCapabilities 檢索裝置的特定裝置資訊。

GetDeviceFileAttributes 檢索特定裝置檔案的屬性。

GetDeviceFileSize 檢索裝置檔案的大小,以位元組為單位。

GetDeviceFileTime 檢索裝置檔案的日期時間。

GetDeviceMemoryStatus 檢索裝置的記憶體使用資訊。

GetDeviceSystemFolderPath 檢索到裝置系統資料夾的路徑。

GetDeviceSystemInfo 檢索裝置的系統詳細資訊。

GetDeviceSystemPowerStatus 檢索裝置的電源狀態。

GetDeviceVersion 檢索裝置的作業系統版本。

MoveDeviceFile 將現有裝置檔案移到或重新命名到一個新位置。

RemoveDeviceDirectory 刪除裝置中的目錄。

SetDeviceFileAttributes 設定裝置中檔案的屬性。

SetDeviceFileTime 設定裝置中檔案的日期時間。

為了簡化 RAPI 類的使用過程,C# 程式碼示例中添加了 using 語句,VB.NET 程式碼示例中添加了 Imports 語句,如下所示:

Imports OpenNETCF.Desktop.Communication

此外,還聲明瞭一個模組變數 myrapi,該變數用於儲存 RAPI 類的例項 

' 宣告 RAPI 物件的例項。
DimWithEvents myrapi AsNew rapi

連線到裝置

桌面應用程式在使用 RAPI 類方法時,第一步是建立與裝置的連線。

注意:在桌面應用程式中使用 RAPI 要求在 PC 和裝置之間啟用 ActiveSync 連線。

本文包含的應用程式示例在 Form_Load 事件中建立與裝置的連線。要連線到裝置,請使用 RAPI 類的 Connect 方法。如以下程式碼所示,緊接著檢查 RAPI 類的 DevicePresent 屬性,以驗證連線是否成功。

Try
' 連線到裝置。
  myrapi.Connect()
  
DoWhileNot myrapi.DevicePresent
    MessageBox.Show(
"請用 ActiveSync將您的PC機和PDA裝置連線好""PDA裝置連線失敗")
    myrapi.Connect()
  
Loop

Catch ex As Exception
  MessageBox.Show(
"試圖連線PDA裝置時出錯"& ex.Message, "連線錯誤")
  Application.Exit()
EndTry

將檔案複製到裝置或從裝置複製檔案

將資料移入或移出裝置的一種最簡單方法是,在 PC 和裝置之間複製文字或 XML 檔案。使用 RAPI 演示程式的方法。在移動應用程式中,文字和基於 XML 的檔案可作為一種簡易方式儲存應用程式資料或配置資料。

OpenNETCF.Desktop.Communication 名稱空間的 RAPI 類提供了兩種方法複製檔案:CopyFileToDeviceCopyFileFromDevice。這兩種方法都將原始檔視作第一個變數,將目標檔案視作第二個變數。

btnCopyPerform 按鈕的單擊事件過程實現了這兩種方法。究竟是呼叫 CopyFileToDevice 方法還是呼叫 CopyFileFromDevice 方法,取決於使用者在使用者介面組合框中選擇的指令。 

' 執行復制。
Try
    
If (txtCopySource.Text =""Or (txtCopyDestination.Text =""Then
      MessageBox.Show(
"您必須提供目標和原始檔的路徑.", _
        
"檔案資訊丟失")
      
Exit Sub
    
EndIf

    
SelectCase cmbCopyDirection.Text
      
Case""
        MessageBox.Show(
"開始複製檔案之前必須選擇一個路徑.", _
          
"沒有選擇路徑")
        
Exit Sub
      
Case"from desktop to device"
        myrapi.CopyFileToDevice(txtCopySource.Text,  txtCopyDestination.Text)
      
Case"from device to desktop"
        myrapi.CopyFileFromDevice(txtCopySource.Text,  txtCopyDestination.Text)
    
EndSelect

    MessageBox.Show(
"檔案已經拷貝成功.""拷貝成功")

' 處理可能發生的所有錯誤。
Catch ex As Exception
    MessageBox.Show(
"拷貝檔案時發生如下錯誤-"& ex.Message, _
      
"拷貝出錯")
  
EndTry

移動裝置中的檔案

有時,您可能需要移動或重新命名裝置中的檔案。例如,在將新版本檔案複製到裝置之前,可能要備份配置檔案

OpenNETCF.Desktop.Communication 名稱空間的 RAPI 類提供了 MoveDeviceFile方法來移動或重新命名檔案。和 CopyFile 方法一樣,該方法也將原始檔視作第一個變數,將目標檔案視作第二個變數。

' 執行移動。
Try
    
If (txtMoveSource.Text =""Or (txtMoveDestination.Text =""Then
      MessageBox.Show(
"您必須提供目標和原始檔的路徑.", _
        
"檔案資訊丟失")
      
Exit Sub
    
EndIf

    myrapi.MoveDeviceFile(txtMoveSource.Text, txtMoveDestination.Text)

    MessageBox.Show(
"檔案移動成功.""移動成功")

' 處理可能發生的所有錯誤。
Catch ex As Exception
    MessageBox.Show(
"移動檔案時發生如下錯誤:"& ex.Message, _
      
"剪切出錯")
  
EndTry

刪除裝置中的檔案

很多時候,您會發現 RAPI 複製檔案方法要與刪除檔案方法一同使用。例如,您可能要求桌面應用程式對應用程式用於儲存裝置資料的檔案進行復制,然後在成功完成複製任務後,返回並從裝置中刪除檔案,以便移動應用程式再次收集新的資料。

OpenNETCF.Desktop.Communication 名稱空間的 RAPI 類提供了 DeleteDeviceFile 方法來刪除裝置檔案。要刪除的檔案是該方法的第一個變數。 

' 執行刪除。
Try
    
If (txtDeleteFile.Text =""Then
      MessageBox.Show(
"您必須提供要刪除的檔案的路徑.", _
        
"沒有提供檔案路徑")
      
Exit Sub
    
EndIf

    myrapi.DeleteDeviceFile(txtDeleteFile.Text)

    MessageBox.Show(
"檔案刪除成功.""刪除成功")

' 處理可能發生的所有錯誤。
Catch ex As Exception
    MessageBox.Show(
"刪除檔案時發生如下錯誤"& ex.Message, _
      
"刪除錯誤")
  
EndTry

 本文就主要介紹這幾個功能,更多內容請檢視MSDN相關文件。

歡迎留言交流Mobile開發技術。接受C#.NET VB.NET 兩種語言。

對於windows mobile sql 中的sdf檔案,很多朋友都會用到。方法也很簡單。同PC上操作SQL server,Oracle等都差不多。

下面共享一個操作SDF資料庫檔案的一個類,供Mobile開發新入門的朋友參考。歡迎留言進行交流。

在用此程式碼之前,需要 using System.Data.SqlServerCe;

class CESql
    
{
        
publicvoid ConnOpen(SqlCeConnection Conn)
        
{
            
if (Conn.State.ToString().Trim().Equals("Open"))
            
{
                Conn.Close();
            }

            Conn.Open();
        }

        
publicvoid ConnClose(SqlCeConnection Conn)
        
{
            
if (Conn.State.ToString().Trim().Equals("Open"))
            
{
                Conn.Close();
            }

        }


        
publicvoid ExecuteSql(string sql, SqlCeConnection Conn)
        
{
            SqlCeCommand MyCommand 
=new SqlCeCommand(sql, Conn);
            MyCommand.ExecuteNonQuery();
            Conn.Close();
        }


        
public SqlCeDataReader GetDataReader(string strCMD, SqlCeConnection Conn)
        
{
            SqlCeDataReader myReader;
            SqlCeCommand mycommand 
=new SqlCeCommand();
            mycommand.CommandText 
= strCMD;
            mycommand.Connection 
= Conn;         
            myReader 
= mycommand.ExecuteReader();
            
return myReader;           
            
        }

    }
mobile中如何取得裝置ID呢?  

請看下面的程式碼(實在懶的寫太多的話了^_^)

DeclareFunction KernelIoControl Lib"coredll" (ByVal dwIoControlCode AsIntegerByVal lpInBuf As IntPtr, ByVal nInBufSize AsIntegerByVal lpOutBuf() AsByteByVal nOutBufSize AsIntegerByRef lpBytesReturned AsIntegerAsInteger

    
PrivateConst IOCTL_HAL_GET_DEVICEID As Int32 =16842836

    
PublicFunction GetSerialNumberFromKernelIoControl() AsString
        
Dim dwOutBytes AsInteger
        
Dim nBuffSize AsInteger
        
Dim strDeviceId AsString
        nBuffSize 
=4096
        
Dim arrOutBuff(4096AsByte
        
Dim res AsBoolean
        res 
= KernelIoControl(IOCTL_HAL_GET_DEVICEID, IntPtr.Zero, 0, arrOutBuff, nBuffSize, dwOutBytes)
        
If res <>FalseThen
            
MsgBox(res.ToString)
            
MsgBox(dwOutBytes.ToString)
            
Dim strDeviceInfo AsString=""
            
Dim i AsInteger
            
Dim strNextChar AsString=""

            
For i =1To dwOutBytes
                strNextChar 
= arrOutBuff(i).ToString
                strDeviceInfo 
= strDeviceInfo + strNextChar
            
Next

            strDeviceId 
= strDeviceInfo

            
Return strDeviceId
        
EndIf
    
End Function

 再新增一個c#版的

publicclass GetDeviceInf
    
{
        [DllImport(
"coredll.dll")]
        
privatestaticexternbool KernelIoControl(Int32 IoControlCode, IntPtr
            InputBuffer, Int32 InputBufferSize, 
byte[] OutputBuffer, Int32
            OutputBufferSize, 
ref Int32 BytesReturned);

        
privatestatic Int32 FILE_DEVICE_HAL =0x00000101;
        
privatestatic Int32 FILE_ANY_ACCESS =0x0;
        
privatestatic Int32 METHOD_BUFFERED =0x0;

        
privatestatic Int32 IOCTL_HAL_GET_DEVICEID =
            ((FILE_DEVICE_HAL) 
<<16| ((FILE_ANY_ACCESS) <<14)
            
| ((21<<2| (METHOD_BUFFERED);
        
privatestaticstring GetDeviceID()
        
{
            
byte[] OutputBuffer =newbyte[256];
            Int32 OutputBufferSize, BytesReturned;
            OutputBufferSize 
= OutputBuffer.Length;
            BytesReturned 
=0;

            
// Call KernelIoControl passing the previously defined
            
// IOCTL_HAL_GET_DEVICEID parameter
            
// We don't need to pass any input buffers to this call
            
// so InputBuffer and InputBufferSize are set to their null
            
// values
            
// 執行上面定義的函式 KernelIoControl
            
// 並傳遞前面已經定義了的靜態變數作為引數

相關推薦

OpenNETCF進行檔案資料同步

大家好,目前資料同步的方式有好幾種,本文主要是以檔案同步的方式同步資料,思路如下:將mobile sql 的sdf格式的資料庫在PC上配置好(當然是用程式碼去操作了)以後,通過OpenNETCF提供的方法,同步到PDA,俗一點說,就是把帶有資料的sdf資料庫拷貝到PDA上,然後,您PDA上程式就可以對該sd

如何使用Git客戶端進行檔案程式碼上傳

repository:知識庫 我們先在自己github中點選New repository 在新跳轉的頁面輸入簡單的資訊,然後點選created repository,這樣,我們就把自己的知識庫建立好了。 建立好以後,我們會跳到下面這個頁面:提示你這個知識庫是空的,建

vue問題之被複的vue檔案vue-echarts實現資料有快取

一、問題 當多個路由複用同一個模板,此時在這幾個路由間切換,被複用的模板有資料快取問題。 如一個路由頁面出現的圖表有5個柱狀圖,在另一個路由頁面出現的圖表是7個柱狀圖,且資料項都不同, 問題:在另一個路由頁面會先出現第一個路由頁面的5個柱狀圖,再載入應有的7個柱狀圖 二、解決方法

基於center loss的人臉識別模型對LFW人臉資料進行評測c++

接上一篇博文,這篇博文主要是進行人臉識別中的第③和第四個步驟:特徵提取以及相似度計算。              center loss是2016的一篇ECCV論文中提出來的,A Discriminative Feature Learning Approach for De

MySql主從配置檔案問題詳解資料同步解決方案

一、問題描述 在mysql主從配置搭建好以後,偶爾會出現從庫無法同步主庫資料的情況,經過測試,把產生主從資料不同步的集中情況進行了歸納以及總結,問題如下: 1、主庫丟擲異常, 例如主鍵衝突等情況,這是主從配置就會失效,叢庫就無法同步主庫的資料了。如下

SSM框架JSON進行前後端資料傳輸及 註解說明

參考連結: 在SSM框架中我們會根據前端傳遞過來的資料進行業務操作,在操作之後會把結果資料返回給前端頁面,前端頁面才會展示給客戶觀看,那麼後臺如何向前端返回資料的呢? 我們在Controller層的Action類中編寫的方法返回值通常會有三種:ModelAndView

html dom與javascript的關系 -我們JavaScript對網頁HTML進行的所有操作都是通過DOM進行

兩種 得來 來講 都對 標記 組織 程序員 tro sdn 一,什麽是DOM (參考源http://www.cnblogs.com/chaogex/p/3959723.html) DOM是什麽 DOM全稱為The Document Object Model,應該理解為是一個

python之爬蟲的入門05------實戰:爬取貝殼網re匹配需要的資料

# 第二頁:https://hz.zu.ke.com/zufang/pg2 # 第一頁:https://hz.zu.ke.com/zufang/pg1 import urllib.request import random import re def user_ip(): ''

在實際的開發工作中,對字串的處理是最常見的程式設計任務。本題目即是要求程式對使用者輸入的串進行處理。具體規則如下: 1把每個單詞的首字母變為大寫。 2把數字與字母之間下劃線字元_分開,使得更

在實際的開發工作中,對字串的處理是最常見的程式設計任務。本題目即是要求程式對使用者輸入的串進行處理。具體規則如下: (1)把每個單詞的首字母變為大寫。 (2)把數字與字母之間用下劃線字元(_)分開,使得更清晰; (3)把單詞中間有多個空格的調整為1個空格。   &

改進的中科院分詞系統NLPIR程式碼加入使用者詞典,去停詞,檔案讀寫+情感分析字典包+工具包+論文包

NLPIR分詞,加入使用者詞典,去停用詞,檔案讀寫等 原始碼下載地址 優化的分詞系統程式碼 原始碼下載地址 NLPIR分詞系統 優化的分詞系統程式碼 以下是核心程式碼 完整程式碼可以直接執行分詞,點我跳轉 public cl

Python對批量音訊檔案wav進行分段切割並儲存

  #coding=gbk import os import wave import numpy as np import pylab as plt CutTimeDef = 1 #以1s截斷檔案 # CutFrameNum =0 path = r"..\test" file

將列表資料寫入檔案python檔案:txt,csv,excel

本篇為轉載,作為記錄學習用的,原作者如下:   作者:記不清下一秒  來源:CSDN  原文:https://blog.csdn.net/u010513327/article/details/80889846    以下是原文內容:

keras對貓、狗資料進行分類

使用已訓練模型對貓狗圖片進行測試,以及視覺化模型訓練過程。 示例程式碼: # # 視覺化卷積神經網路 # # 人們常說,深度學習模型是“黑盒子”,學習表示難以提取並以人類可讀的形式呈現。 # 雖然對於某些型別的深度學習模型來說這是部分正確的,但對於小行星來說絕對不是這樣。 # 由con

【C++】C++讀取特定路徑下所有檔案//*資料夾下的所有圖片、文件等

內容:主要有兩種,一是藉助相關結構體,二是針對檔名排練有序。 一、藉助結構體 1.引用標頭檔案 #include <io.h> #include < fstream> #include < string> 2.適用範圍 沒有限制。

IntelliJ IDEA classpath包含哪些資料夾以及如何把檔案新增到classpath下

在IDEA中,標為藍色的資料夾被認定為包含在classpath中,例如上圖中的resources、src資料夾。把檔案位置以"classpath:applicationContext.xml"的形式提供時,IDEA會從classpath中查詢該檔案,把包含該檔案的資料夾標記為“Source Root”即可

PySpark關於HDFS檔案目錄輸入、資料格式的探討 ####3

背景 平臺HDFS資料儲存規則是按照“資料集/天目錄/小時目錄/若干檔案”進行的,其中資料集是依據產品線或業務劃分的。 使用者分析資料時,可能需要處理以下五個場景: (一)分析指定資料集、指定日期、指定小時、指定檔案的資料;(二)分析指定資料集、指定日期、指定小時的資料;(

彙編基礎練習題14: 編寫排序子程式,把資料區中的N個數進行排序資料區中可能有多個類似13題中a1的變數:a2,a3。。。那麼該子程式應該有幾個入口引數?,然後在主程式中驗證。

彙編基礎練習題14: 編寫排序子程式,把資料區中的N個數進行排序(資料區中可能有多個類似13題中a1的變數:a2,a3。。。那麼該子程式應該有幾個入口引數?),然後在主程式中驗證。 編譯工具:Masm for Windows 整合實驗環境2012.5 (附帶一個工具下載地址https

C語言隨機讀寫資料檔案

int fseek(FILE * fp, long offset, int fromWhere):設定檔案位置標記,方法引數說明: fp:FILE型別指標,該指標對應的檔案即是檔案位置標記所標記的檔案; offset:偏移量; fromWhere:偏移起始點,其值可以為SEEK_SET、SEEK

C語言隨機讀寫資料檔案

void rewind(FILE * fp):將檔案位置標記重新指向檔案開頭,該函式沒有返回值; 【例子】計算機D盤根目錄有一個存放學生資訊的stud.dat檔案,請先講檔案資訊顯示在控制檯,然後在將資料複製到F盤stud.dat檔案中。 #include <stdio.h> #

以太坊ETH同步公鏈資料

前後端分離的啟動 這種方式既可以隨時和geth互動,又不影響geth在後臺執行,在伺服器上非常有必要。先用nohup在後臺程序中跑geth > nohup geth --syncmode full --datadir /data1/eth-sync/online -