我是编码新手,最近一直在做很多教程,学习如何在Visual Studio中使用C#。我最近开始研究自己设计的项目。 该项目旨在生成用于查看照片的网页。部分原因是我需要将名为main.css的文件复制到工作目录,因为此文件定义了网页的样式。我用来编写此文件的代码行是通过单击按钮执行的,如下所示:
Assembly.GetExecutingAssembly().GetManifestResourceStream("ThumbsCreator.main.css").CopyTo(new FileStream(folderPath + "//main.css", FileMode.Create));
ThumbsCreator是命名空间名称,folderpath是一个包含工作目录路径的字符串。 当我运行此代码时,main.css文件总是出现但通常是空白/空的,直到我在程序中运行另一个函数或关闭程序。这似乎与发生的事情有点不一致,但关闭应用程序总是会导致在css文件中出现正确的内容。文件的内容只是文本。任何人都可以建议我如何确保在执行上面的代码行后立即写出css文件?
答案 0 :(得分:0)
您永远不会关闭该文件。这就是为什么在关闭应用程序之前它(或者直到垃圾收集器收集FileStream
实例)之前它仍然处于打开状态的原因。只要它打开,你就无法从其他应用程序中查看该文件。
作为稍长的答案:您在创建FileStream
实例后立即打开文件。由于无法从其他任何地方引用它,最终将被收集(在这种情况下,终结器将确保文件已关闭)。但是这在创建后的某个时间点发生不可预测,或者根本不会发生。也许。这取决于其他分配以及GC是否找到了合适的运行时间。
通常,您应该保留非托管资源(一个打开的文件是不受管理的,因为.NET对此一无所知)只在您需要时打开。您的案例中最简单的方法是using
语句:
using (var fs = File.Create(folderPath + "//main.css"))
{
var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream("ThumbsCreator.main.css");
resource.CopyTo(fs);
}
这将确保您在离开区块后立即关闭文件。
有些类似于
var fs = File.Create(folderPath + "//main.css");
var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream("ThumbsCreator.main.css");
resource.CopyTo(fs);
fs.Close();
(注意:只是勉强,但应该足够接近以便您理解。)这里的要点是using
清楚地说明了您分配的资源(FileStream
)以及何时发布再次(在块的末尾)。对于文件,网络连接和其他具有Dispose
方法的东西,你应该真正开始使用它(不要用它)。