如何打开一个目录来流式传输它

时间:2014-01-12 07:28:24

标签: c# file file-upload

我已经构建了一个可以在彼此之间传输文件的应用程序和服务,但似乎我的代码(应该读取闪存驱动器和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

似乎我不能同时使用相同的代码,但我不知道如何做到这一点。

3 个答案:

答案 0 :(得分:4)

从堆栈跟踪的外观来看,有些东西正在调用File.Open。我假设UploadEx是你写的东西,你可以控制它。

检查以确保FileModeFileAccess值正确无误。


这应该没问题,因为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方法的代码,那么它似乎是一个问题。

Error occuring when not using FileAccess.Read

现在有适当的旗帜

File opening correctly

祝你好运,希望它对你有用: - )

MZ