2014-05-13 170 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