深度优先

这个家伙好懒,除了文章什么都没留下

0%

【DIY】将md文件中的图片下载到本地

读取文件夹下面的*.md文件,正则匹配

1
![](http****)

解析到图片的网络地址,然后模拟请求将图片下载到本地替换md中的url重新写到md文件中,代码如下:

解析Md文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
private static void Main(string[] args)
{
var path = @"C:\xguan\demo\hexo\source\_posts\";

var dir = new DirectoryInfo(path);
var files = dir.GetFiles($"*.md");
foreach (var file in files)
{
StreamReader sr = new StreamReader(file.FullName, Encoding.UTF8);
var source = sr.ReadToEnd();

Regex regex = new Regex(@"!\[\]\((.*?)\)", RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches(source);
foreach (var matche in matches)
{
var url = matche.ToString().Replace("![](", "").TrimEnd(')');

var fileName = Path.GetFileName(url);
if (url.IndexOf("?") != -1)
{
fileName = Path.GetFileName(url.Substring(0, url.IndexOf("?")));
}

if (Path.GetExtension(fileName).Length == 0)
{
fileName = $"{fileName}.png";
}
var newImgSrc = $"./images/{fileName}";

if (DownloadFile(url, newImgSrc))
{
source = source.Replace(url, newImgSrc);
Console.WriteLine($"处理前:{url}");
Console.WriteLine($"处理后:{newImgSrc}");
Console.WriteLine();
}
}
//copy 重新写文件
using (FileStream fs = new FileStream($"./copy/{file.Name}", FileMode.OpenOrCreate))
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(source);
fs.Write(data, 0, data.Length);
}
System.Threading.Thread.Sleep(1000);
}
Console.WriteLine("处理完成");
Console.ReadLine();
}

下载图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private static bool DownloadFile(string url, string filename)
{
if (!url.StartsWith("http"))
{
return false;
}
try
{
HttpWebRequest Myrq = (HttpWebRequest)HttpWebRequest.Create(url);
using (HttpWebResponse myrp = (HttpWebResponse)Myrq.GetResponse())
{
using (Stream st = myrp.GetResponseStream())
{
Stream so = new FileStream($"{filename}", FileMode.OpenOrCreate);
byte[] by = new byte[1024];
int osize = st.Read(by, 0, (int)by.Length);
while (osize > 0)
{
so.Write(by, 0, osize);
osize = st.Read(by, 0, (int)by.Length);
}
so.Close();
Myrq.Abort();
}
};
return true;
}
catch (System.Exception e)
{
Console.WriteLine(e.Message);
return false;
}
}