2010-07-22 74 views
0

我似乎無法找到解決此問題的方法。我試圖讓Windows Mobile 6上的Compact Framework應用程序能夠將本地文件系統上的文件移動到另一個系統。從Windows Mobile設備傳輸文件到...任何地方

這裏是我所知道的解決方案:

  • FTP - 這一問題是大多數 的API是這樣昂貴的使用。

  • HTTP PUT - 就我所能找到的,我不能在IIS7上使用匿名PUT,這就是系統運行的Web服務器。 (對此的一個極端解決方法是使用不同的Web服務器來放置文件,並讓其他系統將其傳輸到IIS系統)。

  • Windows共享 - 我需要對共享進行身份驗證,而且我還沒有看到通過Windows Mobile傳遞此身份驗證的方法。

最後一招是要求這些設備被環抱傳輸這些文件,但我真的喜歡要能夠有這些文件進行無線傳輸。

回答

1

我最終只是通過PHP腳本將信息傳遞給Web服務器。

上面提供的選項只是沒有解決我的情況。

這是它的要義。我在裏面有一些代碼,其中包含進度條和與簡單發送文件無關的各種檢查和處理程序,但我相信你可以通過它進行選擇。我已經從C#和PHP中刪除了我的身份驗證代碼,但如果有必要,它不應該太難以推出自己的身份驗證代碼。

在C#中:(!爲了你的利益詳盡的註釋)

/* 
* Here's the short+sweet about how I'm doing this 
* 1) Copy the file from mobile device to web server by querying PHP script with paramaters for each line 
* 2) PHP script checks 1) If we got the whole data file 2) If this is a duplicate data file 
* 3) If it is a duplicate, or we didn't get the whole thing, it goes away. The mobile 
* device will hang on to it's data file in the first case (if it's duplicate it deletes it) 
* to be tried again later 
* 4) The server will then process the data files using a scheduled task/cron job at an appropriate time 
*/ 
private void process_attempts() 
{ 

    Uri CheckUrl = new Uri("http://path/to/php/script?action=check"); 
    WebRequest checkReq = WebRequest.Create(CheckUrl); 
    try 
    { 
     WebResponse CheckResp = checkReq.GetResponse(); 
     CheckResp.Close(); 
    } 
    catch 
    { 
     MessageBox.Show("Error! Connection not available. Please make sure you are online."); 
     this.Invoke(new Close(closeme)); 
    } 
    StreamReader dataReader = File.OpenText(datafile); 
    String line = null; 
    line = dataReader.ReadLine(); 
    while (line != null) 
    { 
     Uri Url = new Uri("http://path/to/php/script?action=process&line=" + line); 
     WebRequest WebReq = WebRequest.Create(Url); 
     try 
     { 
      WebResponse Resp = WebReq.GetResponse(); 
      Resp.Close(); 
     } 
     catch 
     { 
      MessageBox.Show("Error! Connection not available. Please make sure you are online."); 
      this.Invoke(new Close(closeme)); 
      return; 
     } 
     try 
     { 
      process_bar.Invoke(new SetInt(SetBarValue), new object[] { processed }); 
     } 
     catch { } 
     process_num.Invoke(new SetString(SetNumValue), new object[] { processed + "/" + attempts }); 
     processed++; 
     line = dataReader.ReadLine(); 
    } 
    dataReader.Close(); 
    Uri Url2 = new Uri("http://path/to/php/script?action=finalize&lines=" + attempts); 
    Boolean finalized = false; 
    WebRequest WebReq2 = WebRequest.Create(Url2); 
    try 
    { 
     WebResponse Resp = WebReq2.GetResponse(); 
     Resp.Close(); 
     finalized = true; 
    } 
    catch 
    { 
     MessageBox.Show("Error! Connection not available. Please make sure you are online."); 
     this.Invoke(new Close(closeme)); 
     finalized = false; 
    } 
    MessageBox.Show("Done!"); 
    this.Invoke(new Close(closeme)); 
} 

在PHP:

<?php 

//Get the GET'd values from the C# 

//The current line being processed 
$line = $_GET['line']; 
//Which action we are doing 
$action = $_GET['action']; 
//# of lines in the source file 
$totalLines = $_GET['lines']; 

//If we are processing the line, open the data file, and append this new line and a newline. 
if($action == "process"){ 
    $dataFile = "tempdata/SOME_KIND_OF_UNIQUE_FILENAME.dat"; 
    //open the file 
    $fh = fopen($dataFile, 'a'); 
    //Write the line, and a newline to the file 
    fwrite($fh, $line."\r\n"); 
    //Close the file 
    fclose($fh); 
    //Exit the script 
    exit(); 
} 

//If we are done processing the original file from the C# application, make sure the number of lines in the new file matches that in the 
//file we are transferring. An expansion of this could be to compare some kind of hash function value of both files... 
if($action == "finalize"){ 
    $dataFile = "tempdata/SOME_KIND_OF_UNIQUE_FILENAME.dat"; 
    //Count the number of lines in the new file 
    $lines = count(file($dataFile)); 
    //If the new file and the old file have the same number of lines... 
    if($lines == $totalLines){ 
     //File has the matching number of lines, good enough for me over TCP. 
      //We should move or rename this file. 
    }else{ 
     //File does NOT have the same number of lines as the source file. 
    } 
    exit(); 
} 

if($action == "check"){ 
    //If a file with this unique file name already exists, delete it. 
    $dataFile = "tempdata/SOME_KIND_OF_UNIQUE_FILENAME.dat"; 
    if(file_exists($dataFile)){ 
     unlink($dataFile); 
    } 
} 
?> 
+0

我倒是+1這個,如果你能這麼好心張貼代碼,您是如何做到它。你甚至如何在Mobile 6上運行PHP? – jp2code 2011-12-15 16:46:59

+0

我只是寫了一個PHP腳本,就像你會爲表單處理程序一樣。我通過HTTP請求將數據作爲字節傳遞給PHP腳本,並將字段作爲字段之一。唯一的缺點是POST字段的大小限制,這是由您的Web服務器設置的。 IIRC Apache默認爲20MB。 如果這仍然太模糊,我可以挖掘代碼 - 讓我知道! – jhirsch 2011-12-27 10:08:04

+0

我對PHP一無所知。如果這是C#或甚至C,我可以搞清楚。我有PHP Cookbook,但其中的代碼對我來說仍然是巫術。 – jp2code 2011-12-27 16:43:22

相關問題