这段代码就是获取一个页面的Html代码,写到指定的文件夹里,代码如下:
public bool SaveHtml(string url, string path)
{
try
{
EnsurePath(path); //这个函数就是确保 path 中的文件夹是存在的. string html = getHtmlText(url);
//这里写文件
StreamWriter wr = new StreamWriter(filePath, false, Encoding.GetEncoding("gb2312"));
wr.Write(html);
wr.Flush();
wr.Close(); return true;
}
catch (Exception ex)
{ //往系统的日志里写出错信息
LogHelper.WriteErrorMessage("出错:" + ex.Message + "\nStackTrace:" + ex.StackTrace + "\nSource:" + ex.Source + "\nURL:" + url + "\n存储路径:" + path);
return false;
}
} /// <summary>
/// 确保路径里的文件夹是存在的,不存在,就创建
/// </summary>
/// <param name="Inpath"></param>
public void EnsurePath(string Inpath)
{
string[] pathSplit = Inpath.Split('\\');
string path = pathSplit[0] + "\\" + pathSplit[1];
for (int i = 2; i < pathSplit.Length - 1; i++)
{
path += "\\" + pathSplit[i];
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
}
}
SaveHtml()函数是被循环调用的,大部分时候是好的,但是到了某个文件夹的时候就老是出现 无法创建目录或文件
在出现错误的时候,这个目录下有接近2万5千左右的文件.每个文件大概 16k左右.
不知道是哪里有问题,请大家帮我看看. 非常感谢.
public bool SaveHtml(string url, string path)
{
try
{
EnsurePath(path); //这个函数就是确保 path 中的文件夹是存在的. string html = getHtmlText(url);
//这里写文件
StreamWriter wr = new StreamWriter(filePath, false, Encoding.GetEncoding("gb2312"));
wr.Write(html);
wr.Flush();
wr.Close(); return true;
}
catch (Exception ex)
{ //往系统的日志里写出错信息
LogHelper.WriteErrorMessage("出错:" + ex.Message + "\nStackTrace:" + ex.StackTrace + "\nSource:" + ex.Source + "\nURL:" + url + "\n存储路径:" + path);
return false;
}
} /// <summary>
/// 确保路径里的文件夹是存在的,不存在,就创建
/// </summary>
/// <param name="Inpath"></param>
public void EnsurePath(string Inpath)
{
string[] pathSplit = Inpath.Split('\\');
string path = pathSplit[0] + "\\" + pathSplit[1];
for (int i = 2; i < pathSplit.Length - 1; i++)
{
path += "\\" + pathSplit[i];
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
}
}
SaveHtml()函数是被循环调用的,大部分时候是好的,但是到了某个文件夹的时候就老是出现 无法创建目录或文件
在出现错误的时候,这个目录下有接近2万5千左右的文件.每个文件大概 16k左右.
不知道是哪里有问题,请大家帮我看看. 非常感谢.
这个是出错后写的日志
出现错误,当前页面:CommonMemberTradeLead
出错:无法创建目录或文件。StackTrace: 在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
在 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)
在 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
在 System.IO.StreamWriter.CreateFile(String path, Boolean append)
在 System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize)
在 System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding)
在 Component.PageGenerator.SaveHtml(PageInfo currentInfo) 位置 D:\GenerateStaticPage\Component\Object\Page.cs:行号 143
Source:mscorlib
URL:http://www.luosi.com/TradeLeads/SubScribe2.asp?MemberID=62085&TradeLeadID=80312
存储路径:F:\xxxx\TradeLeads\subscribe2\62085_80312.html有关更多信息,请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。
2. 推荐使用Using关键字
using (StreamWriter wr = new StreamWriter(filePath, false, Encoding.GetEncoding("gb2312"));
wr.Write(html);
wr.Flush();
wr.Close();
)
3. 从你的结果来看,有可能是堆栈过深导致的,可以优化下算法看看。
再继续循环
否则循环过快 就出现
出现错误,当前页面:CommonMemberTradeLead
出错:无法创建目录或文件。
这位朋友很细心,
代码是没有问题的,你看到的filePath 是我在贴代码的时候,把代码改了下,为的是让大家更清晰的知道这个SaveHtml()的流程.
是我说的不全.
1.路径是没有问题的,这个可以确保.
2.开发的机器没有装杀毒软件.程序运行的时候,CPU的占用率一直在20%以下.
你是FORM程序还是WEB程序?
磁盘空间也足够.
调用SaveHtml()函数的是一个Windows服务.
这个方法不要放到SaveHtml()里面,没必要每次都确认。。
只要在循环之前调用一次就够了。。
LogHelper.WriteErrorMessage("出错:" + ex.Message + "\nStackTrace:" + ex.StackTrace + "\nSource:" + ex.Source + "\nURL:" + url + "\n存储路径:" + path);
这一句,调试运行,
错了以后运行标志拖到上面,单步执行,看是哪行报的错,再把path值贴出来
设置不了断点,这个函数是被循环调用的,大概要调用 几万次,设置条件也不行,这个错误不知道什么时候就会Catch到.path 的值 是没有问题的,这个可以确保. 你看看我在前面贴的出错信息. 后面有路径的值.
不知道NTFS里是不是有这种限制
甚至在 Explorer 里 右键, 新建 , 文本文档, 都提示 无法创建文件.
不知道怎么回事.但我在公司的服务器里看了,那个文件夹里至少有16w 个文件. 都没问题.
不过在 Explorer 里进入那个文件夹是相当的慢.
刚才看了下, 磁盘的文件系统是FAT32的, 在这个文件夹下创建了 22389个文件后,就不能创建文件了.删除一个,就可以再创建一个,如果再创建就会出错了.
看来FAT32 的文件系统很烂. 转成NTFS的再试试. 马上结贴. 谢谢大家都关注.