以下是我的代码。
//string[] directories;
List<string> dirs = new List<string>(Directory.EnumerateDirectories("C:\\Users\\Josh"));
//string[] Files;
//directories = Directory.GetDirectories(@"C:\Users\Josh\", "*", SearchOption.AllDirectories);
SqlConnection myConn = new SqlConnection("Server=Josh-PC;database=Music;User ID=Josh; Password=Climber94; Trusted_Connection=True;");
string removeText = "Delete from Music.dbo.SongNamesAndInfo";
SqlCommand RemoveEntry = new SqlCommand(removeText, myConn);
myConn.Open();
RemoveEntry.ExecuteNonQuery();
myConn.Close();
//for (int d = 0; d < directories.Length; d++)
foreach (var dir in dirs)
{
List<string> files = new List<string>(Directory.EnumerateFiles(dir));
foreach (var file in files)
{
FileInfo oFileInfo = new FileInfo(file);
myConn.Open();
string cmdText = "Insert INTO Music.dbo.SongNamesAndInfo " +
"(Name,dtCreationTime,Extension,Length,DirectoryName)" +
"VALUES(@Name,@dtCreationtime,@Extension,@Length,@DirectoryName)";
SqlCommand addCmd = new SqlCommand(cmdText, myConn);
DateTime dtCreationTime = oFileInfo.CreationTime;
addCmd.Parameters.AddWithValue("@Name", oFileInfo.Name);
addCmd.Parameters.AddWithValue("@dtCreationtime", dtCreationTime);
addCmd.Parameters.AddWithValue("@Extension", oFileInfo.Extension);
addCmd.Parameters.AddWithValue("@Length", oFileInfo.Length.ToString());
addCmd.Parameters.AddWithValue("@DirectoryName", oFileInfo.DirectoryName);
if (oFileInfo.Extension.ToLower() == ".mp3" || oFileInfo.Extension.ToLower() == ".avi" ||
oFileInfo.Extension.ToLower() == ".mkv" || oFileInfo.Extension.ToLower() == ".m4a" ||
oFileInfo.Extension.ToLower() == ".aac" || oFileInfo.Extension.ToLower() == ".wav" ||
oFileInfo.Extension.ToLower() == ".mpa" || oFileInfo.Extension.ToLower() == ".wma" ||
oFileInfo.Extension.ToLower() == ".flv" || oFileInfo.Extension.ToLower() == ".m4v" ||
oFileInfo.Extension.ToLower() == ".mpg" || oFileInfo.Extension.ToLower() == ".mov" ||
oFileInfo.Extension.ToLower() == ".wmv" || oFileInfo.Extension.ToLower() == ".mp4")
{
addCmd.ExecuteNonQuery();
}
myConn.Close();
}
所以我正在做的是获取音乐和电影列表并将属性放入sql数据库但我希望它搜索用户文件中的所有目录。由于appdata我得到了
System.UnauthorizedAccessException未处理。
我怎么能避免这个?错误是从用户文件夹Josh中提取所有文件的地方。
答案 0 :(得分:3)
某些文件是系统文件(例如在用户文件夹中的文件,如AppData等)。您可以请求权限或忽略它们
FileIOPermission f = new FileIOPermission(PermissionState.Unrestricted);
f.AllLocalFiles = FileIOPermissionAccess.Read;
try
{
f.Demand();
//your code for processing files
}
catch (SecurityException s)
{
//cannot get permissions for files.got exception
Console.WriteLine(s.Message);
}
我建议你看看Code Access Security https://msdn.microsoft.com/en-us/library/930b76w0(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/0d005ted(v=vs.90).aspx
答案 1 :(得分:0)
使用Directory.EnumerateDirectories一次访问一个文件夹,忽略或记录引发异常的文件夹。这样你就可以得到尽可能多的东西。
如果您想知道如何获得目录的权限,那就是您的用户帐户的权限。
答案 2 :(得分:0)
你应该使用枚举Environment.SpecialFolder
请将Environment.GetFolderPath(Environment.SpecialFolder.MyMusic )
专门用于音乐文件夹或Environment.GetFolderPath(Environment.SpecialFolder.UserProfile ) + @"\Downloads";
等。这是因为理想情况下,您无法访问用户文件夹中Windows资源管理器本身的所有文件夹和子文件夹。这就是抛出异常的地方
所以你的代码就是这样的
string[] directories;
string[] Files;
string folder = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic ) ;
directories = Directory.GetDirectories(folder);