Windows 10开发基础——文件、文件夹和库(一)

Windows 10开发基础——文件、文件夹和库(一)
原文:Windows 10开发基础——文件、文件夹和库(一)

主要内容:

     1.枚举查询文件和文件夹

     2.文本文件读写的三种方法——创建写入和读取文件

     3.获得文件的属性

 

枚举查询文件和文件夹

先了解一下文件查询的几个方法:

StorageFolder.GetFilesAsync: 获取当前文件夹中的所有文件,返回一个 IReadOnlyList<StorageFile>集合

         IReadOnlyList<StorageFile> fileList =await picturesFolder.GetFilesAsync();

StorageFolder.GetFolersAsync:获取当前文件夹中的所有子文件夹,返回一个IReadOnlyList<StorageFolder>集合

        IReadOnlyList<StorageFolder> folderList =await picturesFolder.GetFoldersAsync();

 StorageFolder.GetItemsAsync:获取当前文件夹中的所有文件和子文件夹,返回一个IReadOnlyList<IStorageItem>集合

        ReadOnlyList<IStorageItem> itemsList =await picturesFolder.GetItemsAsync();

        e.g:

       StorageFolder picturesFolder = KnownFolders.PicturesLibrary;

       StringBuilder outputText = new StringBuilder();

       IReadOnlyList<IStorageItem> itemsList = await picturesFolder.GetItemsAsync();//获取当前文件夹中的所有文件和子文件夹
       foreach (var item in itemsList)
       {
             if (item is StorageFolder)
            {
                  outputText.Append(item.Name + " folder\n");

             }
             else
            {
                  outputText.Append(item.Name + "\n");
            }
       }

还要注意一下查询某个位置中的文件并枚举匹配的文件(CommonFolderQuery可取的枚举值很多,转到定义了解一下咯)

StorageFolder picturesFolder = KnownFolders.PicturesLibrary;

StorageFolderQueryResult queryResult = picturesFolder.CreateFolderQuery(CommonFolderQuery.GroupByMonth);//这一行是主要代码,将同一月份的文件归类到一个文件夹
IReadOnlyList<StorageFolder> folderList = await queryResult.GetFoldersAsync();//检索结果集中的文件夹列表

StringBuilder outputText = new StringBuilder();
foreach (StorageFolder folder in folderList)
{
     IReadOnlyList<StorageFile> fileList = await folder.GetFilesAsync();

     outputText.AppendLine(folder.Name + " (" + fileList.Count + ")");//folder.Name的值类似于:2014年12月
     foreach (StorageFile file in fileList)
     {
        outputText.AppendLine(" " + file.Name);
     }
}

 

 

然后我们再来看一个实例:

查询出图片库根目录中的所有图片,然后将图片文件名显示在一个列表中,点击列表的某一项,Image显示对应的图片。

图片库对应于电脑中的下图:

 

1.在Package.appxmanifest中的“功能”节点中选中“图片库”

2.界面布局

   一个按钮,一个ListView,一个Image

 1 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
 2         <Grid.RowDefinitions>
 3             <RowDefinition Height="auto"></RowDefinition>
 4             <RowDefinition Height="*"></RowDefinition>
 5         </Grid.RowDefinitions>
 6         <Button x:Name="button" Content="点击查看图片库" HorizontalAlignment="Center" Margin="0,10,0,10"  VerticalAlignment="Top" Click="button_Click" Width="161"/>
 7         <Grid Grid.Row="1">
 8             <Grid.ColumnDefinitions>
 9                 <ColumnDefinition></ColumnDefinition>
10                 <ColumnDefinition></ColumnDefinition>
11             </Grid.ColumnDefinitions>
12             <ListView  SelectionMode="Single" x:Name="lv_file" Margin="10" Grid.Column="0" IsEnabled="True" SelectionChanged="lv_file_SelectionChanged"  >
13                 <ListView.ItemTemplate>
14                     <DataTemplate>
15                         <TextBlock Text="{Binding}" FontSize="20" Margin="0,5,0,0"  Foreground="Black"></TextBlock>
16                     </DataTemplate>
17                 </ListView.ItemTemplate>
18             </ListView>
19             <Image x:Name="img" Grid.Column="1" Source="Assets/Images/nokiagood2.jpg"></Image>
20         </Grid>
21     </Grid>

3.后台代码

  loadData方法用来获取图片库中的图片,并将文件名绑定的ListView控件上,我们可以在页面的构造函数里面调用它,在应用程序启动之后就显示列表数据。

  在显示图片时用到了WriteableBitmap,它用来创建可显示和更新的位图对象,通过将图片文件写入流(IRandomAccessStream)中,然后从流中读取图形数据并保存到位图中来显示图片。

  GetFileAsync()方法根据传入的string来获取指定的文件

 1    private async void loadData()
 2         {//获取图片库中的图片,并将文件名绑定的ListView控件上
 3 
 4             picturesFolder = KnownFolders.PicturesLibrary;//获取图片库
 5             List<string> filestrlists = new List<string>();
 6             IReadOnlyList<StorageFile> fileList =await picturesFolder.GetFilesAsync();   //获取当前文件夹中的所有文件
 7             foreach (StorageFile file in fileList)
 8             {
 9                 filestrlists.Add(file.Name);
10             }
11             lv_file.ItemsSource = filestrlists;
12         }
13 
14         private  void button_Click(object sender, RoutedEventArgs e)
15         {
16             loadData();
17         }
18 
19         private async  void lv_file_SelectionChanged(object sender, SelectionChangedEventArgs e)
20         {//ListView的选中事件,选择某一项时显示对应得图片
21 
22             WriteableBitmap writeableBitmap = new WriteableBitmap(500,500);
23             string filename = lv_file?.SelectedItem as string;
24 
25             if (filename != null)
26             {
27                 StorageFile file = await picturesFolder?.GetFileAsync(filename);
28                 IRandomAccessStream stream = await file?.OpenAsync(FileAccessMode.Read);
29                 await writeableBitmap.SetSourceAsync(stream);
30                 img.Source = writeableBitmap;
31             }
32         }

4.运行测试。

   

 

文本文件读写的三种方法——创建写入和读取文件

方法一:使用FileIO类WriteTextAsync和ReadTextAsync方法

await FileIO.WriteTextAsync(sampleFile,tb_txt.Text.Trim());//写

string text = await FileIO.ReadTextAsync(sampleFile);      //读

方法二:使用缓冲区(Buffer)

    写:

     var buffer = CryptographicBuffer.ConvertStringToBinary(tb_txt.Text.Trim(), BinaryStringEncoding.Utf8);

     await FileIO.WriteBufferAsync(sampleFile, buffer); 

   读:

     var buffer = await FileIO.ReadBufferAsync(sampleFile);

     using (var dataReader =DataReader.FromBuffer(buffer))

     {

        string text = dataReader.ReadString(buffer.Length);

     }

方法三:使用流(Stream)

      写:

            var stream = await sampleFile.OpenAsync(FileAccessMode.ReadWrite);

            using (var outputStream = stream.GetOutputStreamAt(0))

            {

                using (var dataWriter = new DataWriter(outputStream))

                {

                    dataWriter.WriteString(tb_txt.Text.Trim());

                    await dataWriter.StoreAsync();

                    await outputStream.FlushAsync();

                }

            }

        stream.Dispose();

      读:

           var stream = await sampleFile.OpenAsync(FileAccessMode.ReadWrite);

            ulong size = stream.Size;

            using (var inputStream = stream.GetInputStreamAt(0))

            {

                using (var dataReader = new DataReader(inputStream))

                {

                    uint numBytesLoaded = await dataReader.LoadAsync((uint)size);

                    string text = dataReader.ReadString(numBytesLoaded);

             }

 

接下来是常规演示:在文本框里输入文本,然后点击create按钮创建并写入文件,然后get按钮读出文件中的内容。

界面很简单,直接上图:

代码也容易理解,我就直接贴(注意一些变量的定义是可以提到方法外面的,为了演示,我就都写在方法里面了,实际使用的时候根据情况处理就好了)。

对应于方法一:

        private async void btn_createFile_Click(object sender, RoutedEventArgs e){// 创建一个文件(sample.txt); 如果存在就替换.StorageFolder folder = ApplicationData.Current.LocalFolder;StorageFile sampleFile =await folder.CreateFileAsync("sample.txt",CreationCollisionOption.ReplaceExisting);await FileIO.WriteTextAsync(sampleFile,tb_txt.Text.Trim());}private async void btn_getFile_Click(object sender, RoutedEventArgs e){StorageFolder folder = ApplicationData.Current.LocalFolder;StorageFile sampleFile =await folder.GetFileAsync("sample.txt");string text = await FileIO.ReadTextAsync(sampleFile);showmsg(text);}private async void showmsg(string content){MessageDialog msg = new MessageDialog(content, "info");await  msg.ShowAsync();}

对应于方法二:

       private async void btn_cerateFileBuffer_Click(object sender, RoutedEventArgs e){StorageFolder folder = ApplicationData.Current.LocalFolder;StorageFile sampleFile = await folder.CreateFileAsync("sample.txt", CreationCollisionOption.ReplaceExisting);var buffer = CryptographicBuffer.ConvertStringToBinary(tb_txt.Text.Trim(), BinaryStringEncoding.Utf8);await FileIO.WriteBufferAsync(sampleFile, buffer);}private async void btn_getFileBuffer_Click(object sender, RoutedEventArgs e){StorageFolder folder = ApplicationData.Current.LocalFolder;StorageFile sampleFile = await folder.GetFileAsync("sample.txt");var buffer = await FileIO.ReadBufferAsync(sampleFile);string text;using (var dataReader =DataReader.FromBuffer(buffer)){text = dataReader.ReadString(buffer.Length);}showmsg(text);}

对应于方法三:

    private async void btn_createFileStream_Click(object sender, RoutedEventArgs e){StorageFolder folder = ApplicationData.Current.LocalFolder;StorageFile sampleFile =await  folder.CreateFileAsync("sample.txt", CreationCollisionOption.ReplaceExisting);var stream = await sampleFile.OpenAsync(FileAccessMode.ReadWrite);using (var outputStream = stream.GetOutputStreamAt(0)){using (var dataWriter = new DataWriter(outputStream)){dataWriter.WriteString(tb_txt.Text.Trim());await dataWriter.StoreAsync();await outputStream.FlushAsync();}}stream.Dispose(); }private async void btn_getFileStream_Click(object sender, RoutedEventArgs e){StorageFolder folder = ApplicationData.Current.LocalFolder;StorageFile  sampleFile = await folder.GetFileAsync("sample.txt");var stream = await sampleFile.OpenAsync(FileAccessMode.ReadWrite);ulong size = stream.Size;using (var inputStream = stream.GetInputStreamAt(0)){string text;using (var dataReader = new DataReader(inputStream)){uint numBytesLoaded = await dataReader.LoadAsync((uint)size);text = dataReader.ReadString(numBytesLoaded);}showmsg(text);}}

然后我们再来看一个实例:

将部分程序界面截图保存至应用程序存储,然后进行读取。还将演示如何保存至图片库。

1.涉及到操作图片库,首先也要去Package.appxmanifest中的“功能”节点中选中“图片库”。(以后不再赘述)

2.界面布局

  注意grid和cgrid都是我们要截图保存的UI元素,都要给它们一个Background。(你可以试试,不给是什么情况)

    <Grid x:Name="grid"  Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><Grid.RowDefinitions><RowDefinition Height="*"></RowDefinition><RowDefinition Height="*"></RowDefinition></Grid.RowDefinitions><Grid Margin="10" x:Name="cgrid"   Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"><Button x:Name="btn_createImg" Content="create a picture file" HorizontalAlignment="Left" Margin="12,33,0,0" VerticalAlignment="Top" Click="btn_createImg_Click"/><Button x:Name="btn_getImg" Content="get a picture file" HorizontalAlignment="Left" Margin="206,33,0,0" VerticalAlignment="Top" Click="btn_getImg_Click"/><Image  x:Name="img_original" HorizontalAlignment="Left"  Margin="12,117,0,0" Source="Assets/Images/nokiagood2.jpg" Stretch="UniformToFill" VerticalAlignment="Top" Width="338"/><Button x:Name="btn_save" Content="save to photos" HorizontalAlignment="Left" Margin="12,80,0,0" VerticalAlignment="Top" Width="128" Click="btn_save_Click"/></Grid><Image Grid.Row="1" x:Name="img_create" HorizontalAlignment="Left" Height="217" Margin="12,20,0,0" Stretch="UniformToFill" VerticalAlignment="Top" Width="338"/></Grid>

3.后台代码

创建图片文件并保存至应用程序存储中。RenderTargetBitmapBitmapEncoder类需要重点理解一下。

   private async void btn_createImg_Click(object sender, RoutedEventArgs e){renderTargetBitmap = new RenderTargetBitmap();//RenderTargetBitmap类可以将可视化对象转换为位图await renderTargetBitmap.RenderAsync(cgrid);var pixelBuffer = await renderTargetBitmap.GetPixelsAsync();var folder = ApplicationData.Current.LocalFolder;var file = await folder.CreateFileAsync("screenshot.png",CreationCollisionOption.ReplaceExisting);using (var stream=await file.OpenAsync(FileAccessMode.ReadWrite)){var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);//BitmapEncoder类包含创建、编辑和保存图像的各种方法
                encoder.SetPixelData(BitmapPixelFormat.Bgra8,BitmapAlphaMode.Ignore, (uint)renderTargetBitmap.PixelWidth,(uint)renderTargetBitmap.PixelHeight,DisplayInformation.GetForCurrentView().LogicalDpi,DisplayInformation.GetForCurrentView().LogicalDpi,pixelBuffer.ToArray());            //设置图像有关帧的像素数据await encoder.FlushAsync();//提交和刷新图像数据
            }}

 

从应用程序中读取显示图片

   private async void btn_getImg_Click(object sender, RoutedEventArgs e){//方法一:类似于实例一中的方法来展示图片WriteableBitmap writeableBitmap = new WriteableBitmap(renderTargetBitmap.PixelWidth, renderTargetBitmap.PixelHeight);var folder = ApplicationData.Current.LocalFolder;var file = await folder.GetFileAsync("screenshot.png");IRandomAccessStream stream = await file?.OpenAsync(FileAccessMode.Read);await writeableBitmap.SetSourceAsync(stream);img_create.Source = writeableBitmap;//方法二:通过应用文件的Uri方案来展示图片//BitmapImage bitmapImage = new BitmapImage(new Uri("ms-appdata:///local/screenshot.png", UriKind.Absolute));//img_create.Source = bitmapImage;}

 

将图片保存至图片库。

   private async void btn_save_Click(object sender, RoutedEventArgs e){WriteableBitmap writeableBitmap = new WriteableBitmap(renderTargetBitmap.PixelWidth, renderTargetBitmap.PixelHeight);var folder = ApplicationData.Current.LocalFolder;var sourcefile = await folder.GetFileAsync("screenshot.png");//获取图片screenshot.png
StorageFile destinationFile = await KnownFolders.CameraRoll.CreateFileAsync("screenshot.png",CreationCollisionOption.ReplaceExisting);//在图片库中的CameraRoll文件夹中创建文件using (var sourceStream = await sourcefile.OpenReadAsync()){using (var sourceInputStream = sourceStream.GetInputStreamAt(0)){using (var destinationStream = await destinationFile.OpenAsync(FileAccessMode.ReadWrite)){using (var destinationOutputStream = destinationStream.GetOutputStreamAt(0)){await RandomAccessStream.CopyAndCloseAsync(sourceInputStream, destinationStream);//复制源流到目标流
                        }}}}}

4.运行测试。

 

 

获得文件的属性

(msdn: https://msdn.microsoft.com/zh-cn/library/windows/apps/mt186454.aspx )

获取文件的顶级属性(这些属性包括文件属性、内容类型、创建日期、显示名称和文件类型等。)

              StringBuilder fileProperties = new StringBuilder();
              fileProperties.AppendLine("File name: " + file.Name);
              fileProperties.AppendLine("File type: " + file.FileType);

获取文件的基本属性

多数基本属性都是通过先调用StorageFile.GetBasicPropertiesAsync()方法获得的。此方法会返回一个BasicProperties对象,该对象将定义项(文件或文件夹)的大小属性,以及上次修改项的时间。

              BasicProperties basicProperties = await file.GetBasicPropertiesAsync();

              string fileSize = string.Format("{0:n0}", basicProperties.Size);
              fileProperties.AppendLine("File size: " + fileSize + " bytes");
              fileProperties.AppendLine("Date modified: " + basicProperties.DateModified);

获取文件的扩展属性

扩展属性只能通过以下方法获得:将代表将要检索的属性名称的 String 对象的 IEnumerable 集合传递到BasicProperties.RetrievePropertiesAsync 方法。之后此方法会返回一个 IDictionary 集合。然后可以按名称或通过索引从这个集合中检索每个扩展属性。     

   const string dateAccessedProperty = "System.DateAccessed";const string fileOwnerProperty = "System.FileOwner";var folder = KnownFolders.PicturesLibrary;var query = folder.CreateFileQuery();var files = await query.GetFilesAsync();foreach (StorageFile file in files){StringBuilder fileProperties = new StringBuilder();var propertyNames = new List<string>();propertyNames.Add(dateAccessedProperty);propertyNames.Add(fileOwnerProperty);IDictionary<string, object> extraProperties = await file.Properties.RetrievePropertiesAsync(propertyNames);        var propValue = extraProperties[dateAccessedProperty];if (propValue != null){fileProperties.AppendLine("Date accessed: " + propValue);}propValue = extraProperties[fileOwnerProperty];if (propValue != null){fileProperties.AppendLine("File owner: " + propValue);}

太晚了,这个不准备实例了。睡觉!

posted on 2015-09-28 11:45 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/4843670.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sigmoid函数与逻辑回归

文章目录(1). Sigmoid函数的由来——伯努利分布的衍生物1.1 为什么会有 sigmoid 函数的出现&#xff1f;1.2 sigmoid 函数推导过程1.3 sigmoid 函数求导(2). 逻辑回归&#xff08;Logistic Regression&#xff09;2.1 逻辑回归算法的最终本质——求决策边界2.2 逻辑回归算法中的…

Avalonia跨平台入门第二十二篇之人脸检测

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送、语音播放、语音播放问题、玩…

pkpm板按弹性计算还是塑性_PKPM中的S\R验算显红原因分析

PKPM软件砼结构施工图中的&#xff0c;梁的配筋面积中&#xff0c;SR验算&#xff0c;经常会有个别构件显红的情况。查了一下PKPM说明书&#xff0c;并没有针对此情况的详细说明。根据本人的实际经验&#xff0c;总结了一下解决此问题的主要方法&#xff1a;一.超筋SR的值显示为…

多智能体连续行为空间问题求解——MADDPG

目录1. 问题出现&#xff1a;连续行为空间出现2. DDPG 算法2.1 DDPG 算法原理2.2 DDPG 算法实现代码2.2.1 Actor & Critic2.2.2 Target Network2.2.3 Memory Pool2.2.4 Update Parameters&#xff08;evaluate network&#xff09;2.2.5 Update Parameters&#xff08;targ…

在.NET 6 中如何创建和使用 HTTP 客户端 SDK

如今&#xff0c;基于云、微服务或物联网的应用程序通常依赖于通过网络与其他系统通信。每个服务都在自己的进程中运行&#xff0c;并解决一组有限的问题。服务之间的通信是基于一种轻量级的机制&#xff0c;通常是一个 HTTP 资源 API。从.NET 开发人员的角度来看&#xff0c;我…

ttl接地是高电平还是低电平_功放技术参数1——高电平

在汽车音响中的功放或者DSP再或者是DSP功放中我们都会遇到高电平信号或者低电平信号输入&#xff0c;我们该如何判断主机输出的到底是高电平信号还是低电平信号呢&#xff1f;我们可以用一个很简单的方法来鉴定&#xff0c;那就是主机输出能够直接驱动喇叭的为高电平信号输出&a…

MultiProcessing中主进程与子进程之间通过管道(Pipe)通信

Python 中 Multiprocessing 实现进程通信1. 如何建立主进程与子进程之间的通信管道&#xff1f;2. 为什么一定要将Pipe中的某些端close()?本文参考自&#xff1a;python 学习笔记 - Queue & Pipes&#xff0c;进程间通讯 1. 如何建立主进程与子进程之间的通信管道&#xf…

如何为 .NET 项目自定义强制代码样式规则

前言每个人都有自己的代码样式习惯:命名约定、大括号、空格、换行等。但是&#xff0c;作为一个团队来说&#xff0c;应该使用同样的代码样式规则。这样可以有效减少编译器的警告/建议&#xff0c;保证阅读代码的人员理解一致。今天我们介绍一种为单独的 .NET 项目定义代码样式…

我是如何帮助创业公司改进企业工作的

前段时间在一家创业公司实习&#xff0c;几十个人的团队&#xff0c;正处在规模逐渐扩大的阶段&#xff0c;但是整个公司的协作工作和日常管理却越来越麻烦&#xff0c;鉴于我以前对Saas和协作平台都有过一点研究&#xff0c;于是leader叫我去找一个“简单&#xff0c;好用&…

PHP单例模式(精讲)

2019独角兽企业重金招聘Python工程师标准>>> 首先我们要明确单例模式这个概念&#xff0c;那么什么是单例模式呢&#xff1f; 单例模式顾名思义&#xff0c;就是只有一个实例。作为对象的创建模式&#xff0c;单例模式确保某一个类只有一个实例&#xff0c;而且自行…

【QMIX】一种基于Value-Based多智能体算法

文章目录1. QMIX 解决了什么问题&#xff08;Motivation&#xff09;2. QMIX 怎样解决团队收益最大化问题&#xff08;Method&#xff09;2.1 算法大框架 —— 基于 AC 框架的 CTDE&#xff08;Centralized Training Distributed Execution&#xff09; 模式2.2 Agent RNN Netw…

增强型的for循环linkedlist_LinkedList的复习

先摘选一段Testpublic void test_LinkedList() { // 初始化100万数据 List list new LinkedList(1000000);// 遍历求和int sum 0;for (int i 0; i sum list.get(i); }}乍一看可能觉得没什么问题&#xff0c;但是这个遍历求和会非常慢。主要因为链表的数据结构…

3月更新来了!Windows 11正式版22000.556发布

面向 Windows 11 正式版用户&#xff0c;微软现已发布累积更新 KB5011493&#xff0c;更新后版本号升级至 Build 22000.556。主要变化1.微软正在改变 Windows 11 "开始"菜单中推荐模块有关 Office 文件的打开方式。如果文件被同步到 OneDrive&#xff0c;“开始”菜单…

[C/C++]重读《The C Programming Language》

第一次读这本书的时候是大三初&#xff0c;现在打算重读一遍&#xff01;。 第一章 导言 1. 学习一门新程序设计语言的唯一途径就是用它来写程序。 2. 每个程序都从main函数的起点开始执行。 3. 在C语言中&#xff0c;所有变量必须先声明后使用。 4. C语言中的基本数据类型的大…

115怎么利用sha1下载东西_618“甩”度娘,拥抱115,体验和价格才是王道

网盘价钱​前天618&#xff0c;圈子里的朋友几乎都“甩”了度娘一巴掌&#xff0c;我才知道115搞活动&#xff0c;由原来500元1年的钻石会员&#xff0c;变成500元3年&#xff0c;算起来每天不到0.5元&#xff0c;确实比度娘实惠了很多&#xff0c;而且活动持续到6月底。自从发…

安装宝塔面板

安装宝塔面板&#xff1a; 1. 宝塔面板网站&#xff1a; https://www.bt.cn/ 2.安装教程 https://www.bt.cn/bbs/thread-1186-1-1.html 3.1 使用远程工具连接执行以下命令 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh &&…

【COMA】一种将团队回报拆分为独立回报的多智能体算法

文章目录1. COMA 解决了什么问题&#xff08;Motivation&#xff09;2. COMA 怎么解决独立回报分配问题&#xff08;Method&#xff09;2.1 核心思想 counterfactual baseline 的提出2.2 算法大框架 —— 基于 AC 框架的 CTDE&#xff08;Centralized Training Distributed Exe…

C#解析Markdown文档,实现替换图片链接操作

前言又是好久没写博客了其实也不是没写&#xff0c;是最近在「做一个博客」&#xff0c;从2月21日开始&#xff0c;大概一个多星期的时间&#xff0c;疯狂刷进度&#xff0c;边写代码边写了一整系列的博客开发笔记&#xff0c;目前为止已经写了16篇了&#xff0c;然后上3月之后…

LoadRunner测试下载功能点脚本(方法一)

性能需求&#xff1a;对系统某页面中&#xff0c;点击下载功能做并发测试&#xff0c;以获取在并发下载文件的情况下系统的性能指标。 备注&#xff1a;页面上点击下载时的文件可以是word、excel、pdf等。 问题1&#xff1a;录制完下载的场景后&#xff0c;发现脚本里面并没有包…

海南橡胶机器人成本_「图说」海垦看点:海南橡胶联合北京理工华汇智能科技首创我国林间智能割胶机器人...

1 海垦南繁产业集团长期以来高度重视改善职工居住条件&#xff0c;于去年启动了海燕队保障性住房项目&#xff0c;项目建成后将有效解决职工住房问题。图为近日正在加紧施工的建设工地。 蒙胜国 摄2 海南橡胶联合北京理工华汇智能科技有限公司&#xff0c;研发出来的最新一代林…