我已经构建了一个可以在彼此之间传输文件的应用程序和服务,但似乎我的代码(应该读取闪存驱动器和CD上的目录)仅适用于闪存驱动器。
foreach (RadTreeNode l_node in m_fileExplorer.SelectedNodes) {
string l_sSelectedPath = l_node.Name;
FileAttributes l_fileAttr = File.GetAttributes(l_sSelectedPath);
if (l_fileAttr == FileAttributes.Directory) {
foreach (string l_sFilename in Directory.GetFiles(l_sSelectedPath, "*.*", SearchOption.AllDirectories)) {
m_qUpload.Enqueue(
new UploadDescriptor {
BatchDescription = m_tbDescription.Text,
BatchTimestamp = l_now,
BatchId = l_sBatchId,
Username = m_frmLogin.Username,
TargetUsername = l_sTargetUsername,
Filename = l_sFilename
}
);
AddProgressRow(l_sFilename);
l_nFilesInBatch++;
ms_sem.Release();
}
}
}
当我尝试对CD执行相同操作时,我收到此错误:
System.UnauthorizedAccessException: Access to the path 'D:\' is denied.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at System.IO.File.Open(String path, FileMode mode, FileAccess access)
at ActivePath.FileUploader.Frontend.UploadForm.UploadEx(Object sender, DoWorkEventArgs e) in c:\code\Customers\FIBI\PWFileUploader\PWFileUploaderApplication\UploadForm.cs:line 697
似乎我不能同时使用相同的代码,但我不知道如何做到这一点。
答案 0 :(得分:4)
从堆栈跟踪的外观来看,有些东西正在调用File.Open
。我假设UploadEx
是你写的东西,你可以控制它。
检查以确保FileMode
和FileAccess
值正确无误。
这应该没问题,因为FileMode.Open
说文件只有在文件存在时才会被打开,FileAccess.Read
会阻止写入文件:
File.Open(somePath, FileMode.Open, FileAccess.Read);
这些可能不会,因为如果文件不存在,你的程序将尝试创建它,这在cd-rom上不会很好。或者,如果您有无意中修改文件的代码,那么也无法正常工作。
File.Open(somePath, FileMode.OpenOrCreate);
File.Open(somePath, FileMode.Open, FileAccess.ReadWrite);
从代码的外观来看,你似乎没有做任何事情,只是阅读目录中的所有文件,但我看不到你所有的代码,所以我只是把它扔出去答案。
好的,根据我在评论中链接的帖子,这里有一个适合您的解决方案。我实际上没有构建它,所以可能有一两个语法错误。如果不起作用,请给我留言。
你是最新的foreach
循环:
foreach (RadTreeNode l_node in m_fileExplorer.SelectedNodes)
{
string l_sSelectedPath = l_node.Name;
FileAttributes l_fileAttr = File.GetAttributes(l_sSelectedPath);
if (l_fileAttr == FileAttributes.Directory)
DoWhatever(l_sSelectedPath);
}
以递归方式扫描每个目录的新方法,忽略抛出异常的目录:
private void DoWhatever(string path)
{
try
{
Directory.GetFiles(path)
.ToList()
.ForEach(l_sFilename =>
{
m_qUpload.Enqueue(
new UploadDescriptor {
BatchDescription = m_tbDescription.Text,
BatchTimestamp = l_now,
BatchId = l_sBatchId,
Username = m_frmLogin.Username,
TargetUsername = l_sTargetUsername,
Filename = l_sFilename
}
);
AddProgressRow(l_sFilename);
l_nFilesInBatch++;
ms_sem.Release();
});
Directory.GetDirectories(path)
.ToList()
.ForEach(s => DoWhatever(s));
}
catch (UnauthorizedAccessException ex)
{
// We're not authorized to access this directory. Who knows why. Ignore it.
}
}
答案 1 :(得分:0)
参考这篇文章 How to present credentials in order to open file? 使用凭据打开文件。 如果您正在通过网络进行操作,请尝试授予对网络服务的访问权限。
请参阅此MSDN帖子以获取例外情况 http://forums.asp.net/t/1013434.aspx?System+UnauthorizedAccessException+Access+to+the+path+D+thumbs+5B62060C102F6363635A+jpg+is+denied+
希望这有帮助!
答案 2 :(得分:0)
我试图摆弄你的问题。您确定要将FileAccess.Read
标记传递给File.Open
方法吗?尝试打开没有此标志的文件时,我确实收到错误。但是当你使用合适的旗帜时,它就可以了。 TBH最好的方法是,如果您要显示来自UploadEx方法的代码,那么它似乎是一个问题。
现在有适当的旗帜
祝你好运,希望它对你有用: - )
MZ