2009-04-23 20 views
3

我们正在更换一个“旧”web应用程序(最初的CodeCentral是在10年前编写的,现在运行在http://cc.embarcadero.com,服务超过1270万)使用基于文件的缓存服务下载。 Web应用程序管理这个文件缓存。如何更新IIS和ASP.NET上的共享文件?

使用基于文件的下载的唯一复杂的一点是更新可能被另一个版本使用的文件。当我编写CodeCentral的原始Delphi CGI版本时,我依稀记得能够重命名现有文件,即使有人可能正在下载它,使用正确的名称编写新文件,并最终清理旧文件。

但是,我可能会妄想,因为这不符合我们当前的IIS 6和ASP.NET 2.x或3.x代码。所以,我们做了什么,而不是是这样的,这是相当缺憾,但最终的作品:

public static void FileCreate(Stream AStream, string AFileName, int AWaitInterval) 
{ 
    DateTime until = DateTime.Now.AddSeconds(AWaitInterval); 
    bool written = false; 
    while (!written && (until > DateTime.Now)) 
    { 
    try 
    { 
     using (FileStream fs = new FileStream(AFileName, FileMode.Create)) 
     { 
     CopyStream(AStream, fs); 
     written = true; 
     } 
    } 
    catch (IOException) 
    { 
     Thread.Sleep(500); 
    } 
    } 
} 

我想我们失去了一些东西简单,我们有了更好的方法来替换文件目前正在通过IIS和ASP.NET下载。在那儿?

回答

2

我想我们用下面的逻辑来解决此问题:

我们店的日期/时间的文件被更新。如果我们无法更新数据驱动的文件名“[id] .zip”,我们将创建“[id] _ [modified] .zip”,然后使用它直到我们能够将其重命名为“[id] .zip”删除旧版本的文件。

这样,在查找“[id] .zip”之前,我们首先查找“[id] _ [modified] .zip”,以确保最新文件的安全,并且我们可以轻松实现清理,即使在我们最终替换“标准”“[id] .zip”版本之前有多个修改版本,也可以在需要和后台执行后续例程。

当然,这只适用于存储上次文件修改的时间,但任何使用这种技术的系统都应该。

0

约翰,你可以多说一点情况吗?

如果文件足够小,您可以将整个文件加载到内存中,然后将其发送到客户端。

也许这个blog post about downloading and deleting temporary files会有所帮助。

+1

感谢您的询问,Greg。这些是大文件,500MB或更多。此外,它们不是临时文件,而是有时需要更新的文件。大多数文件不会改变,但是当他们这样做时,我们需要确保我们可以用新版本替换它们。你的问题促使我再次思考 - 也许我们可以在文件中嵌入一个版本标记并以此方式解决问题。 – 2009-06-02 21:04:08