本帖最后由 jiaoshudong 于 2023-3-28 09:16 编辑
第一次发帖,轻拍。
每人都会收藏书签,时间长了会积累很多,还会有重复收藏,特此写出如下软件。
通过查看导出的书签发现,书签文件是一个html文件,内容也是html格式,每个书签都是一个A标签,快捷功能按钮不是,里面会有ADD_DATE添加日期属性(unix时间),LAST_MODIFIED属性(应该是更新日期,也是unix格式),还有最重要的HREF属性,和ICON图标属性。
通过读取书签文件的每行标签,判断HREF链接,如果集合不存在该链接,则添加到一个集合并写入新文件(是按照原来的标签内容写的),如果存过则跳过,并且不写入新文件。以上就是该软件的逻辑,另外几个辅助方法是从网上找的,谢谢大佬的贡献。
本来想用XPATH匹配HREF内容,前面没写过,就直接用的从网上找的方法了。
核心就是判断HREF是否重复。
运行逻辑就是,从chrome或edge导出全部书签,然后把路径写入软件需要去重复的文本框。然后想把生成后的新书签放到哪,写上路径和文件名,写入到去重复后的文本框内。然后点击按钮稍等一会就会把新文件生成到“去重复后的”文本框内写的路径文件里,然后再把chrome或edge的书签全部删除,再把新生成的书签导入进去。(因为之前已经导出了一个全部书签,那个就算备份了,如果新生成的去重复书签不满意,可以把原来的全部书签重新导入回去)。
因为没加验证与异常处理,所以大家手动写一下文件路径吧
附件怎么设置成免费的?大佬们帮忙转一下蓝奏链接吧
int i = 0;
private void button1_Click(object sender, EventArgs e)
{
Encoding encode = System.Text.Encoding.GetEncoding("UTF-8");
string dirPath = @"E:/";
DirectoryInfo dirInfo = new DirectoryInfo(dirPath);
FileInfo[] files = dirInfo.GetFiles();
string filename = textBox2.Text;// dirPath + "/new.html";
StreamWriter sw = new StreamWriter(filename, true, encode);
List<string> lines = new List<string>();
// 读取HTML文件
string fileName = textBox1.Text;// @"E:\chrome.html";
StreamReader sr = new StreamReader(fileName, encode);
// 逐行读取文件内容
string line = "";
while ((line = sr.ReadLine()) != null)
{
if (line.Contains("HREF="))
{
var val = GetTitleContent(line, "A", "HREF");
if (lines.Contains(val))
{
Debug.WriteLine("chongfu:" + val);
i++;
DisplayInfo(richTextBox1, i + "." + val);
}
else
{
lines.Add(val);
sw.WriteLine(line);
}
}
else
{
lines.Add(line);
sw.WriteLine(line);
}
}
sw.WriteLine();
sw.Flush();
// 关闭文件流
sr.Close();
}
辅助方法,谢谢大佬的方法
/// <summary>
/// 获取字符中指定标签的值
/// 2、获取标签中的属性: string str = "<a href=\"www.csdn.net\" class=\"main\">CSDN</a>" 获取 “href” 的结果:www.csdn.net
/// 调用例子:string href = GetTitleContent(str, "a", "href");
/// </summary>
/// <param name="str">字符串</param>
/// <param name="title">标签</param>
/// <param name="attrib">属性名</param>
/// <returns>属性</returns>
public static string GetTitleContent(string str, string title, string attrib)
{
string tmpStr = string.Format("<{0}[^>]*?{1}=(['\"\"]?)(?<url>[^'\"\"\\s>]+)\\1[^>]*>", title, attrib); //属性值
Match TitleMatch = Regex.Match(str, tmpStr, RegexOptions.IgnoreCase);
string result = TitleMatch.Groups["url"].Value;
return result;
}
|