首页 > 编程语言 >ASP.NET 8 AOT 遍历文件夹获取文件名称及时长

ASP.NET 8 AOT 遍历文件夹获取文件名称及时长

时间:2024-09-09 13:47:19浏览次数:7  
标签:文件 ASP string writer 音视频 AOT ex WriteLine 文件名称

朋友下了N多视频

记不住文件夹下都有啥了…

问批处理怎么导出文件夹下所有文件名及视频时长…


批处理导出文件名好弄,获取视频时长真没用过…

想到 .net 控制台程序 AOT 发布,不和批处理差不多效果…


新建个控制台项目选下使用AOT

image



首先要获取文件的时长,我们需要用下 TagLibSharp

Install-Package TagLibSharp


然后是遍历文件夹,让万能的 chatgpt 写一个:


		/// <summary>
		/// 列出指定目录及其子目录中的文件,限制递归深度。
		/// </summary>
		/// <param name="path">当前目录路径</param>
		/// <param name="writer">StreamWriter 对象,用于写入文件</param>
		/// <param name="currentDepth">当前递归深度</param>
		static void ListFilesAndDirectories(string path, StreamWriter writer, int currentDepth)
		{
			// 最大递归深度设定为3
			const int maxDepth = 3;

			// 如果当前深度超过最大深度,则返回
			if (currentDepth > maxDepth)
			{
				return;
			}

			try
			{
				// 获取当前目录下的所有文件
				string[] files = Directory.GetFiles(path);
				foreach (string file in files)
				{
					if (file != outputFilePath  && file != ownFilePath)
					{
						FileInfo fileInfo = new FileInfo(file);
						string fileInfoText = $"{fileInfo.Name},  {fileInfo.DirectoryName}\\,  {ConvertBytesToReadableSize(fileInfo.Length)} ";


						// 判断文件类型并获取时长(如果为音视频文件)
						if (IsMediaFile(fileInfo.Extension))
						{
							TimeSpan duration = GetMediaDuration(file);
							fileInfoText += $",{duration.ToString(@"hh\:mm\:ss")}";
						}
						else
						{
							fileInfoText += $",";
						}

						// 写入文件信息到文本文件
						Console.WriteLine($"文件名: {fileInfo.Name}, 大小: {ConvertBytesToReadableSize(fileInfo.Length)} 字节");
						writer.WriteLine(fileInfoText);
					}


				}

				// 获取当前目录下的所有子目录
				string[] directories = Directory.GetDirectories(path);
				foreach (string directory in directories)
				{
					// 递归调用以列出子目录中的文件,并增加递归深度
					ListFilesAndDirectories(directory, writer, currentDepth + 1);
				}
			}
			catch (UnauthorizedAccessException ex)
			{
				// 处理无权限访问的异常
				Console.WriteLine($"无法访问目录 {path}: {ex.Message}");
				writer.WriteLine($"无法访问目录 {path}: {ex.Message}");
			}
			catch (Exception ex)
			{
				// 处理其他异常
				Console.WriteLine($"处理目录 {path} 时出错: {ex.Message}");
				writer.WriteLine($"处理目录 {path} 时出错: {ex.Message}");
			}
		}




我们根据后缀名来判断下是否为音视频文件:

		/// <summary>
		/// 判断文件是否为音视频文件
		/// </summary>
		/// <param name="extension">文件扩展名</param>
		/// <returns>是否为音视频文件</returns>
		static bool IsMediaFile(string extension)
		{
			string[] mediaExtensions = { ".mp3", ".wav", ".wma", ".m4a", ".mp4", ".avi", ".mkv", ".webm", ".mov" };
			return Array.Exists(mediaExtensions, e => e.Equals(extension, StringComparison.OrdinalIgnoreCase));
		}



如果是音视频文件,返回时长:

		/// <summary>
		/// 获取音视频文件的时长
		/// </summary>
		/// <param name="filePath">音视频文件路径</param>
		/// <returns>时长</returns>
		static TimeSpan GetMediaDuration(string filePath)
		{
			try
			{
				// 使用 TagLib 获取音视频文件时长
				var file = TagLib.File.Create(filePath);
				return file.Properties.Duration;
			}
			catch (Exception ex)
			{
				Console.WriteLine($"无法获取文件 {filePath} 的时长: {ex.Message}");
				return TimeSpan.Zero;
			}
		}



最后格式化文件大小,好看一些:

		/// <summary>
		/// 将字节转换为可读的文件大小格式(如 KB, MB, GB 等)。
		/// </summary>
		/// <param name="bytes">文件大小(以字节为单位)</param>
		/// <returns>可读的文件大小格式</returns>
		static string ConvertBytesToReadableSize(long bytes)
		{
			if (bytes < 0)
			{
				throw new ArgumentException("字节数不能为负数。", nameof(bytes));
			}

			// 定义文件大小单位及其缩写
			string[] sizeUnits = { "B", "KB", "MB", "GB", "TB", "PB", "EB" };
			int unitIndex = 0;

			double size = bytes;

			// 不断除以 1024,直到找到合适的单位
			while (size >= 1024 && unitIndex < sizeUnits.Length - 1)
			{
				size /= 1024;
				unitIndex++;
			}

			// 返回带有单位的文件大小,保留两位小数
			return $"{size:0.00} {sizeUnits[unitIndex]}";
		}



最后填充下main函数,我们创建一个csv用于写入数据

		static void Main(string[] args)
		{
			DateTime d1=DateTime.Now;
			// 获取当前目录
			string currentDirectory = Directory.GetCurrentDirectory();
			ownFilePath = Process.GetCurrentProcess().MainModule.FileName;

			string filrName = $"FileList{d1.ToString("yyyyMMddHHmmss")}.csv";

			// 定义输出文件路径
			outputFilePath = Path.Combine(currentDirectory, filrName);

			// 创建或覆盖输出文件
			using (StreamWriter writer = new StreamWriter(outputFilePath, false, System.Text.Encoding.UTF8))
			{
				writer.WriteLine("文件名,路径,大小,时长");
				Console.WriteLine("文件名,路径,大小,时长");
				// 递归列出当前目录及最多3层子目录的文件
				ListFilesAndDirectories(currentDirectory, writer, 0);
			}

			Console.WriteLine("遍历完毕,按回车退出!");
			Console.ReadLine();
		}




因为我们使用了第三方的包,在AOT发布前需要处理下,给项目添加个 rd.xml 文件,把我们的第三方包集成进去,文件内容如下:

<Directives>
  <Application>
    <Assembly Name="TagLibSharp"  Dynamic="Required All">
    </Assembly>
  </Application>
</Directives>



然后修改项目文件,增加 rd.xml

image



最后就是AOT发布了

目前vs还不支持直接AOT发布(https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/aot/native-aot-tutorial?view=aspnetcore-8.0&tabs=visual-studio

需要自己手打下命令

image


到 \bin\Release\net8.0\win-x64\publish 下就能看到发布的文件了

运行下看看效果:

image


生成的csv文件:

image

标签:文件,ASP,string,writer,音视频,AOT,ex,WriteLine,文件名称
From: https://www.cnblogs.com/sun8134/p/18404388

相关文章

  • Python和MATLAB(Java)及Arduino和Raspberry Pi(树莓派)点扩展函数导图
    ......
  • 【Java】已解决:org.aopalliance.aop.AspectException
    文章目录一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项已解决:org.aopalliance.aop.AspectException一、分析问题背景在使用SpringAOP(面向切面编程)时,开发者有时会遇到org.aopalliance.aop.AspectException报错。这通常发生......
  • C++ 调用 C# - AOT 方案
    一些C#AOT编译的笔记,整体感觉:简单很方便,但限制也很多,适用于比较单一的功能点。跨语言调用C#代码的新方式-DllExport-InCerry-博客园在.NET8下,直接添加<PublishAot>true</PublishAot>就可以支持了,需要注意一些限制,这里比较相关的是,不能使用Newtonsoft.Json做序列......
  • Java 通过aspose.words 把docx文件转成pdf文件后中文变成小方块,aspose转pdf乱码问题的
    Java通过aspose.words把docx文件转成pdf文件后中文变成小方块,aspose转pdf乱码问题的解决方法一、问题描述​在centos服务器使用aspose.word转换word文件为pdf的时候显示中文乱码,但是在win服务器上使用可以正常转换二、问题原因由于linux服务器缺少对应的字库导致文件转换出现......
  • aspose word转换pdf文件后将pdf文件转换为图片png
    asposeword转换pdf文件后将pdf文件转换为图片png链接:asposeword模板文件生成pdfhttps://www.cnblogs.com/oktokeep/p/16615900.htmlpackagecom.example.core.mydemo.aspose;importorg.apache.pdfbox.pdmodel.PDDocument;importorg.apache.pdfbox.rendering.ImageType;......
  • 事务发件箱模式在 .NET 云原生开发中的应用(基于Aspire)
    原文:TransactionalOutboxin.NETCloudNativeDevelopmentviaAspire作者:OleksiiNikiforov总览这篇文章提供了使用Aspire、DotNetCore.CAP、AzureServiceBus、AzureSQL、Bicep和azd实现Outbox模式的示例。源代码:https://github.com/NikiforovAll/cap-aspire......
  • aspose word指定位置插入图片,借助word模板文件中的书签来定位 及Java 获取网络图片
    asposeword指定位置插入图片,借助word模板文件中的书签来定位 及Java 获取网络图片链接:asposeword模板文件生成pdfhttps://www.cnblogs.com/oktokeep/p/16615900.html在Aspose.Words中,您可以使用DocumentBuilder类在指定位置插入图片。以下是一个简单的示例代码,展示如何实现......
  • asp.net中配置文件如何注册引用
    配置文件如何注册引用注册配置文件的形式注册方式//第一种注册方式:注册配置文件builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));AppSettingsappSettings=builder.Configuration.GetSection(AppSettings.Key).Get<AppSettin......
  • OWASP TOP10 漏洞解析:访问控制崩溃
    一、定义访问控制崩溃,指的是访问控制策略没有被正确地执行,导致用户可以在他们的预期权限之外进行操作。这种缺陷通常会导致未授权的信息被泄露、修改、销毁,或者让用户执行了超出其权限限制的业务功能。表现形式,也就是我们常说的越权漏洞。越权分为:水平越权:A、B两个用户......
  • ASP.NET MVC+LayUI视频上传
    前言前段时间在使用APS.NETMVC+LayUI做视频上传功能的时,发现当上传一些内存比较大的视频就会提示上传失败,后来通过查阅相关资料发现.NETMVC框架为考虑安全问题,在运行时对请求的文件的长度(大小)做了限制默认为4MB(4096KB),因此我们需要在Web.Config中设置最大请求文件长度大小,本文主要......