Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不写入磁盘的情况下读取流?_C#_Asp.net_Asp.net Mvc_File_Report - Fatal编程技术网

C# 如何在不写入磁盘的情况下读取流?

C# 如何在不写入磁盘的情况下读取流?,c#,asp.net,asp.net-mvc,file,report,C#,Asp.net,Asp.net Mvc,File,Report,我使用ReportViewer创建了一个报告,我可以在本地机器上生成它,而且没有任何问题。另一方面,在将应用程序发布到IIS后,我遇到一个错误“对路径'C:\xxxxxxx.xlsx'的访问被拒绝。”。当然这是由权限问题引起的,但在我们公司,在大多数情况下,C驱动器的任何位置都没有写入权限,我认为最好的方法是在内存中打开生成的excel文件等(不写入磁盘)。那么,如何更新我使用的方法来实现这一点呢?有什么想法吗 我将报告(使用ReportViewer创建)作为Stream发送到此方法,并在不写入

我使用
ReportViewer
创建了一个报告,我可以在
本地机器上生成它,而且没有任何问题。另一方面,在将应用程序发布到
IIS
后,我遇到一个错误“对路径'C:\xxxxxxx.xlsx'的访问被拒绝。”。当然这是由
权限问题引起的
,但在我们公司,在大多数情况下,C驱动器的任何位置都没有写入权限,我认为最好的方法是在内存中打开生成的excel文件等(不写入磁盘)。那么,如何更新我使用的方法来实现这一点呢?有什么想法吗

我将报告(使用
ReportViewer
创建)作为
Stream
发送到此方法,并在不写入磁盘的情况下打开生成的报告:

public static void StreamToProcess(Stream readStream, string fileName, string fileExtension)
{
    var myFile = fileName + "_" + Path.GetRandomFileName();
    var writeStream = new FileStream(String.Format("{0}\\{1}.{2}",
            Environment.GetFolderPath(Environment.SpecialFolder.InternetCache), myFile, 
                fileExtension), FileMode.Create, FileAccess.Write);

    const int length = 16384;
    var buffer = new Byte[length];
    var bytesRead = readStream.Read(buffer, 0, length);
    while (bytesRead > 0)
    {
        writeStream.Write(buffer, 0, bytesRead);
        bytesRead = readStream.Read(buffer, 0, length);
    }
    readStream.Close();
    writeStream.Close();
    Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.
                    InternetCache) + "\\" + myFile + "." + fileExtension);
}       
任何帮助都将不胜感激

更新:

我将报告流传递给此方法,如下所示:

StreamToProcess(reportStream, "Weekly_Report", "xlsx");

注意:
reportStream
是使用
ReportViewer
生成的报告。您可以改为写入
MemoryStream
并将此流返回给调用者。确保没有关闭内存流的实例。如果要处理内存中的文件,则可以将此内存流传递给
StreamWriter
实例

public static Stream StreamToProcess(Stream readStream)
{
    var myFile = fileName + "_" + Path.GetRandomFileName();
    var writeStream = new MemoryStream();

    const int length = 16384;
    var buffer = new Byte[length];
    var bytesRead = readStream.Read(buffer, 0, length);
    while (bytesRead > 0)
    {
        writeStream.Write(buffer, 0, bytesRead);
        bytesRead = readStream.Read(buffer, 0, length);
    }
    readStream.Close();

    return writeStream;     
}       

当前调用
Process.Start
的方法在IIS服务器上不起作用,因为它将在服务器上而不是在用户计算机上打开Excel文档。您必须向用户提供一个链接来下载该文件,您可以使用一个AJAX请求,该请求从MemoryStream流式传输。有关如何实现此功能的更多详细信息,请查看此信息。

非常感谢您的回复,但我无法将此流传递给
StreamWriter
实例。我还添加了一个更新。通过查看此更新,您能否更新您的答案,说明如何获取此流?我扩展了我的答案,今晚稍后将尝试添加一个示例。非常感谢您的帮助。我用这种方法解决了这个问题。您的回复也很有用,我相信您可以将文件写入应用程序的根文件夹中。你可以进入那里。如果您担心文件被塞满,您可以在下载后立即删除它们,或者让一个进程对您进行批处理。您需要授予应用程序池使用的
IIS\u用户
,对要写入的文件夹授予写入权限。因为您使用的是
Process.Start
您不能使用MemoryStream。@Jaco为什么要删除您的好答案?我不必使用流程。如果我没有流程就解决了问题,那么就开始吧。你可以发布并编辑它,以便我可以打开你的方法返回的流吗?谢谢…人们经常使用“应用程序数据”文件夹来实现这些目的。您可以像这样获取其相对路径:string path=HttpContext.Current.Server.MapPath(“~/App\u Data/”);应用程序数据在您的VS解决方案中,请务必。通常发生的情况是,如果文件夹为空,则在生成生成/发布时,文件夹不会进入生成的包中。若要修复此问题,请在Visual Studio中的应用程序数据中添加一个dumb.txt文件,然后再次发布。文件夹将在那里。还要确保将.txt文件生成操作设置为Content