2012-04-27 40 views
0

我一直試圖通過我的ASP.NET網站通過P/Invoke來編寫和讀取文件。我在網站上通過dlls執行此操作時遇到了文件寫入/讀取位置的問題。我試圖解釋與下面的例子問題:通過在ASP.NET bin文件夾中的P/Invoke讀取/寫入文件問題

.cpp文件(包括讀,寫功能)

extern "C" TEST_API int fnTest(char* fileDir) 
{ 
ofstream myfile; 
myfile.open (strcat(fileDir, "test.txt")); 
myfile << "Writing this to a file.\n"; 
myfile.close(); 
} 

extern "C" TEST_API char* fnTest1(char* fileDir) 
{ 
ifstream myReadFile; 
myReadFile.open(strcat(fileDir, "test1.txt")); 
char output[100]; 
if (myReadFile.is_open()) { 
while (!myReadFile.eof()) { 
    myReadFile >> output; 
return output; 
} 

後建立網站的情況下,從上述C,複製dll的++項目網站的bin文件夾

Default.aspx.cs - C#
DLL函數

public static class Functions(){ 
DllImport[("Test1.dll", EntryPoint="fnTest", CharSet=CharSet.Ansi] 
public static extern int fnTest(string dir); 

DllImport[("Test1.dll", EntryPoint="fnTest1", CharSet=CharSet.Ansi] 
public static extern StringBuilder fnTest1(string dir); 
} 

Page_Load事件

string direc = AppDomain.CurrentDomain.BaseDirectory + "bin\\"; 
string txt1 = Functions.fnTest(direc).ToString(); //failing here - keeps on loading the page forever 
string txt2 = Functions.fnTest(direc).ToString(); //failing here - keeps on loading the page forever 

如果我試圖在桌面應用程序相同的Page_Load代碼direc被設置爲項目輸出的當前目錄下,一切工作正常。只有在網站的情況下,要寫入或讀取文件的目錄纔會變得混亂,而我實際上無法弄清楚如何解決此問題並使其正常工作。建議將不勝感激。

+0

您已經提出了完全相同的問題。答案也是一樣的。將完整路徑傳遞給您的本機代碼。我在你之前的問題上的回答甚至解決了你返回字符串的錯誤。 – 2012-04-27 16:11:43

+0

@DavidHeffernan:這次傳遞完整的路徑,就像上面寫的那樣,現在錯誤已經改變了。所以,爲我嘗試過的東西寫了一篇新文章,但仍有錯誤 – user1240679 2012-04-27 16:13:44

+0

您沒有將完整路徑傳遞給該文件。你剛剛通過了目錄。所以你不能'strcat',因爲它增加了'fileDir'的結尾,你不能寫入那個內存,因爲它是由pinvoke編組所擁有的。在上一個問題中,你沒有注意到我答案的後半部分。 – 2012-04-27 16:16:48

回答

0

您仍有許多問題與您在last question中遇到的問題相同。

這一次你最大的問題是在這裏:

strcat(fileDir, "test.txt") 

,因爲它是由PInvoke的編組擁有您不能修改fileDir。而不是將目錄傳遞給您的本機代碼,請將完整路徑傳遞給該文件。在您的託管代碼中使用Path.Combine來創建它,並將其傳遞給本機代碼。

extern "C" TEST_API int fnTest(char* filename) 
{ 
    ofstream myfile; 
    myfile.open(filename); 
    myfile << "Writing this to a file.\n"; 
    myfile.close(); 
} 

,並在託管代碼

string filename = Path.Combine(
    AppDomain.CurrentDomain.BaseDirectory, "bin", "test.txt"); 
string txt1 = Functions.fnTest(filename).ToString(); 

在評論你解釋,你需要連接字符串中的本地代碼。您將需要創建一個本地字符串來執行此操作,因爲您不允許寫入fileDir。事情是這樣的:

string fileName = string(fileDir) + "test.txt"; 
myfile.open(fileName.c_str()); 

但你仍然需要修復fnTest1讀取文件。我在你的另一個問題的答案告訴你如何做到這一點。

+0

@DavidHefferman:原來這個連接操作只能在C++程序中以某種方式執行。文本文件的名稱在C#程序中是未知的,只能在C++程序中知道,無法更改。整個程序與帖子完全不同,但我選擇寫一個我面臨的問題的例子。有沒有解決方法,我可以使用'concatenatination'和fileDir來處理C++中所有的txt文件? – user1240679 2012-04-27 16:22:47

+0

作爲試圖找出問題的一部分,我通過傳遞Windows窗體應用程序的'Project output'目錄並使用上述所有功能來讀取和寫入文件並且工作正常,嘗試了相同的連接。我想知道爲什麼在這種情況下可以執行級聯操作,而不是在網站的情況下? – user1240679 2012-04-27 16:28:56

+0

我最近的更新告訴你如何連接C++中的字符串。 – 2012-04-27 16:30:07