2014-05-13 212 views
-1

我有一臺雲端數據庫服務器,就像我在我的電腦上申請我的遊戲。但是,每次用戶嘗試保存數據時,都會收到UnauthorizedAccessException。 我正在運行它的管理員和我沒有任何specias在我的文件夾中,所以我不知道有什麼問題。 這是我的代碼:未授權訪問異常

public const string root = "D:/DATABASE/"; 
public static void WriteData(string playername, string type, string data) 
{ 
    if (!Directory.Exists("D:/DATABASE/" + playername)) 
    { 
     Directory.CreateDirectory("D:/DATABASE/" + playername); 
     Directory.CreateDirectory("D:/DATABASE/" + playername + "/weapons"); 
    } 
    if (type != "Weapon") 
    { 
     using (StreamWriter sw = new StreamWriter("D:/DATABASE/" + playername + "/" + type + ".sav")) 
     { 
      sw.WriteLine(data); 
     } 
    } 
    else 
    { 
     string[] dat = data.Split('%'); 
     using (StreamWriter sw = new StreamWriter("D:/DATABASE/" + playername + "/weapons/" + dat[0] + ".gfa")) 
     { 
      string[] lines = dat[1].Split('@'); 
      foreach (string cline in lines) 
      { 
       sw.WriteLine(cline); 
      } 
     } 
    } 
} 
public static string ReadLoadout(string playername) 
{ 
    string output = ""; 
    string[] items = new string[2]; 
    using (StreamReader sr = new StreamReader(root + playername + "/loadout.gfl")) 
    { 
     items[0] = sr.ReadLine(); 
     items[1] = sr.ReadLine(); 
    } 
    int c = 0; 
    foreach (string citem in items) 
    { 
     if (c > 0) output += "$"; 
     output += citem + "%" + GetCompressedWeaponFile(playername, citem); 
     c++; 
    } 
    return output; 
} 

public static string GetCompressedWeaponFile(string playerName, string weaponName) 
{ 
    string output = ""; 

    using (StreamReader sr = new StreamReader(root + playerName + "/weapons/" + weaponName)) 
    { 
     string line = " "; 
     int c = 0; 
     while (line != null) 
     { 
      line = sr.ReadLine(); 
      if (line != null) 
      { 
       if (c > 0) output += "@"; 
       output += line; 
      } 
      c++; 
     } 
    } 
    return output; 
} 
public static void RegisterNewUser(string username, string password, string email) 
{ 
    string udir = root + username; 
    Directory.CreateDirectory(udir); 
    Directory.CreateDirectory(udir + "/weapons"); 
    Directory.CreateDirectory(udir + "/loadouts"); 
    File.WriteAllText(udir + "/password.sav", password); 
    File.WriteAllText(udir + "/level.sav", "1"); 
    File.WriteAllText(udir + "/money.sav", "1000"); 
    File.WriteAllText(udir + "/email.sav", email); 
    File.WriteAllText(udir + "/loadout.gfl", ""); 
    using (StreamWriter sw = new StreamWriter(root + "emails.txt", true)) 
    { 
     sw.WriteLine(email); 
    } 
    Email.Send(email, "New Account Registration", string.Format(mailTemplate, username, password)); 
} 
public static void EditLoadout(string username, string items) 
{ 
    File.WriteAllLines(root + username + "/loadout.gfl",items.Split('#')); 
} 
+4

如果您更新了問題以指出哪一行引發異常,那將會很有幫助。 –

+0

嘗試在指定的位置創建文件或目錄,並確定您是否有權利? – Hassan

+0

我對這個目錄有充分的權利。並且我不知道這行是不是在我的代碼中顯示一個(它在C#庫代碼中)。其實它的作品有效,但其中大部分將失敗 – DELTA12

回答

0

如果沒有更多的信息,很難提供具體的幫助。以下是一些故障排除建議:

1)嘗試在另一臺機器上運行您的代碼。特別是你的開發電腦。你仍然有同樣的錯誤?如果不是,那麼確實存在許可問題。

2)您是否嘗試檢查異常的堆棧跟蹤?

當您在自己的計算機上運行該應用程序時,請嘗試使用IDE來顯示該異常。是的,這個問題可能最終會在一個低級別的類中,但是你應該能夠打破錯誤並回到調用堆棧中,看看你的代碼中的哪個方法實際上拋出了錯誤。

3)檢查實際異常,即使是系統級異常。

如果你能夠在IDE中進行調試,你將會看到屬性信息,這會給你一個提示。它是在目錄方法還是在文件寫入方法中?檢查其他屬性。某處它可能會給你路徑的文本(假設它是一個文件問題),它可能會幫助縮小範圍。

4)加入異常處理代碼

這是一個很好的經驗法則,你應該真正做到這一點無論如何,使一個更強有力的方案。無論您打電話給誰(您的,他人或系統方法),您需要確定應該在哪裏處理。

例如,在你的代碼,在RegisterNewUser()方法,可以考慮這樣的:

public static void RegisterNewUser(string username, string password, string email) 
{ 
    try 
    { 
     string udir = root + username; 
     Directory.CreateDirectory(udir); 
     Directory.CreateDirectory(udir + "/weapons"); 
     Directory.CreateDirectory(udir + "/loadouts"); 
     File.WriteAllText(udir + "/password.sav", password); 
     File.WriteAllText(udir + "/level.sav", "1"); 
     File.WriteAllText(udir + "/money.sav", "1000"); 
     File.WriteAllText(udir + "/email.sav", email); 
     File.WriteAllText(udir + "/loadout.gfl", ""); 
     using (StreamWriter sw = new StreamWriter(root + "emails.txt", true)) 
     { 
      sw.WriteLine(email); 
     } 
     Email.Send(email, "New Account Registration", string.Format(mailTemplate, username, password)); 
    } 
    catch (Exception ex) 
    { 
     // Create a method to display or log the exception, with it's own error handler 
     LogAndDisplayExceptions(ex); 
     // Send the user a message that we failed to add them. Put this in it's own try-catch block 
     // ideally, for readability, in it's own method. 

     try 
     { 
      Email.Send(email, "Failed to register", "An error occurred while trying to add your account."); 
     } 
     catch (Exception exNested) 
     { 
      LogAndDisplayExceptions(exNested); 
     } 
    } 
} 

5)「崩潰 - 燃燒」的異常處理程序添加到「主」 在該方法那就是你的「頂級方法」(很難告訴你提供的代碼片段,因爲只有很少的方法會試圖寫入磁盤),你可以將你的代碼封裝在try-catch塊中並打印異常或寫入磁盤。

如果您在將異常寫入磁盤時遇到問題,我會建議先創建一個錯誤文件,確保運行該程序的用戶帳戶可以寫入該文件,然後在catch塊中打開該文件附加。這應該可以更容易地找到錯誤文本。

6)當所有其他都失敗時,使用Debug類或控制檯類來寫傳統的「我讓它行x」。

雖然這不會解決您的問題,但它應該有助於您獲得更多信息,以便更深入地瞭解代碼導致錯誤的位置。

+0

真的,多虧了我會嘗試,但註冊完全正常。我得到數據嵌入/保存的問題 – DELTA12