首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在FileShare.ReadWrite MVC中使用HttpPostedFile和HttpPostedFile

在FileShare.ReadWrite MVC中使用HttpPostedFile和HttpPostedFile
EN

Stack Overflow用户
提问于 2019-05-25 18:23:25
回答 1查看 278关注 0票数 4

我正在使用下面的代码将已发布的文件保存到服务器,但是该文件将被持续读取,并且需要使用FileShare.ReadWrite,这样我就不会收到锁定的错误。

代码语言:javascript
复制
 httpRequest.Files[0].SaveAs(filePath);

下面是我的读取方法,如何用HttpPosted文件完成这一任务是正确的方法,具有最佳的性能。

代码语言:javascript
复制
using (var fileStream = new FileStream(
                   fileLocation,
                   FileMode.Open,
                   FileAccess.Read,
                   FileShare.ReadWrite))
                {
                    using (var streamReader = new StreamReader(fileStream))
                    {
                        xDocument = XDocument.Parse(streamReader.ReadToEnd());
                    }
                }

这是我最好的选择吗?

代码语言:javascript
复制
 using (var memoryStream = new MemoryStream())
                {
                    httpRequest.Files[0].InputStream.CopyTo(memoryStream);
                    var bytes = memoryStream.ToArray();

                    using (var fs = File.Open(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
                    {
                        fs.Write(bytes, 0, bytes.Length);
                    }
                }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-03 12:39:56

问题:

  • 你想要一个“写:一次,读:很多”的锁

假设:

  • 文件很小(平均写入操作为5000 ms)
  • 没有其他的读写选项(只有一个带有2功能的程序)
  • 你读这个文件比给它写的要多得多

解决方案

代码语言:javascript
复制
    using System;
    using System.IO;
    using System.Threading;
    using System.Web.Mvc;

    namespace stackoverflow_56307594.Controllers
    {

        public class HomeController : Controller
        {

            public ActionResult A()
            {
                readFile();
                return View();
            }

            public ActionResult B()
            {
                writeFile();
                return View();
            }


            private static object writeLock = new Object();

            private void readFile()
            {
                while (!Monitor.TryEnter(writeLock, 5000)) ; //wait 5000 ms for the writeLock (serializing access)
                using (var stream = new FileStream("filePath", FileMode.Open, FileAccess.Read, FileShare.Read))
                using (var reader = new StreamReader(stream))
                {
                    // active read
                    // xDocument = XDocument.Parse(streamReader.ReadToEnd());

                }
            }
            private void writeFile()
            {
                lock (writeLock)
                {
                    FileStream stream = null;
                    while (stream == null) //wait for the active read
                    {
                        try
                        {
                            stream = new FileStream("filePath", FileMode.Open, FileAccess.ReadWrite, FileShare.None);
                        }
                        catch (IOException)
                        {
                        // will fail if active read becase FileShare.None   while (stream == null) will  wait
                    }
                }
                    Request.Files[0].InputStream.CopyTo(stream);
                }// unlock
            }

        }
    }

注意:

  1. 我没有测试负载,或者只是在test服务器上测试解决方案。
  2. 我只在纸上测试过

参考文献:

锁定-- C#锁等待多长时间,如果代码在锁期间崩溃怎么办?-堆栈溢出

c# -删除正在使用的文件-堆栈溢出

多线程-是否有方法检测对象是否被锁定?-堆栈溢出

在C# \ Microsoft中实现Singleton

c# -对多个方法使用相同的锁-堆栈溢出

c# -写-一次,读-许多锁-堆栈溢出

c#锁写曾经读过很多- Google搜索

FileShare Enum (System.IO) \ Microsoft Docs

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56307594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档