当前位置: 首页 > news >正文

10.2 目录(文件夹)操作

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

10.2.1 DirectoryInfo类

DirectoryInfo类可以获得目录信息。

DirectoryInfo常用属性:

  1. Name:获取DirectoryInfo实例的名称,例如:c:\windows\system32将返回system32。
  2. FullName:获取目录或文件的完整目录。例如:c:\windows\system32将返回c:\windows\system32。
  3. Attributes:目录的属性。
  4. Exists:目录是否存在。
  5. CreationTime:目录的创建时间。
  6. LastWriteTime:目录的最后修改时间。
  7. Parent:目录的父目录。

DirectoryInfo常用方法:

  1. Create:创建目录。
  2. Delete:删除目录,使用此方法带参数的重载可以实现删除目录下的子目录和文件,否则只能删除空目录。
  3. MoveTo:移动目录。注意:此方法只能在同一个磁盘分区下移动。
  4. GetDirectories:返回当前目录的子目录列表,这是一个DirectoryInfo数组。
  1. GetFiles:返回当前目录的文件列表,这是一个FileInfo数组。关于FileInfo类,请参看第10.3.1节。
10.2.1.1 获取目录信息

【例 10.2【项目:code10-002】获得计算机上某个目录的信息。

当选择某个文件夹后,立即在文本框中显示该文件夹的相关信息:

     private void button1_Click(object sender, EventArgs e)

        {

            FolderBrowserDialog fbd = new FolderBrowserDialog();

            fbd.ShowNewFolderButton = false;

            if (fbd.ShowDialog() != DialogResult.OK)

                return;

            string folderpath = fbd.SelectedPath;

            DirectoryInfo di = new DirectoryInfo(folderpath);

            textBox1.Text = "文件夹:" + di.Name + "\r\n";

            textBox1.Text += "路径:" + di.FullName + "\r\n";

            textBox1.Text += "创建日期:" + di.CreationTime.ToString("yyyy-MM-dd") + "\r\n";

            textBox1.Text += "最后修改日期:" + di.LastWriteTime.ToString("yyyy-MM-dd") + "\r\n";

            textBox1.Text += "属性:" + getFolderAttr(di.Attributes) + "\r\n";

        }

        //获得文件夹属性

        private string getFolderAttr(FileAttributes attr)

        {

            string strAttr = "";

            if((attr & FileAttributes.Archive)==FileAttributes.Archive)

                strAttr += " 备份";

            if ((attr & FileAttributes.Hidden) == FileAttributes.Hidden)

                strAttr += " 隐藏";

            if ((attr & FileAttributes.Compressed) == FileAttributes.Compressed)

                strAttr += " 压缩";

            if ((attr & FileAttributes.Directory) == FileAttributes.Directory)

                strAttr += " 目录";

            if ((attr & FileAttributes.Encrypted) == FileAttributes.Encrypted)

                strAttr += " 加密";

            if ((attr & FileAttributes.Offline) == FileAttributes.Offline)

                strAttr += " 脱机";

            if ((attr & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)

                strAttr += " 只读";

            if ((attr & FileAttributes.System) == FileAttributes.System)

                strAttr += " 系统";

            if ((attr & FileAttributes.Temporary) == FileAttributes.Temporary)

                strAttr += " 临时";

            return strAttr;

        }

运行结果如下图所示:

图10-2 获取目录信息

10.2.1.2 获取子目录和文件

获取当前目录的子目录和所有文件主要是使用GetDirectories和GetFiles方法,这两个方法返回包含的子目录(DirectoryInfo数组)和文件(FileInfo数组),只需要分别遍历这两个数组即可获得相关信息。

【例 10.3【项目:code10-003】获得子目录和文件。

        private void button1_Click(object sender, EventArgs e)

        {

            FolderBrowserDialog fbd = new FolderBrowserDialog();

            if (fbd.ShowDialog() != DialogResult.OK)

                return;

            label1.Text = fbd.SelectedPath;

            DirectoryInfo di = new DirectoryInfo(label1.Text);

            listBox1.Items.Clear();

            //遍历当前目录下的子目录

            foreach (DirectoryInfo subdi in di.GetDirectories())

            {

                listBox1.Items.Add("目录:" + subdi.Name);

            }

            //遍历当前目录下的文件

            foreach (FileInfo fi in di.GetFiles())

            {

                listBox1.Items.Add("文件:" + fi.Name);

            }

        }

运行结果如下图所示:

图10-3 获得选定目录的子目录和文件

10.2.1.3 设置目录属性

通过DirectoryInfo类的Attributes属性可以获得和设置目录属性。Attributes的值是一个FileAttributes枚举,它提供了文件和目录的属性。

表10-1 FileAttributes枚举常用成员及对应属性说明

成员名称

对应属性说明

成员名称

对应属性说明

Archive

备份

Normal

正常

Compressed

压缩

Offline

脱机

Directory

指示这是目录

ReadOnly

只读

Encrypted

加密

System

系统

Hidden

隐藏

Temporary

临时

判断现有属性是否包括某个属性,请使用:现有属性 And 某个属性:

表10-2 判断是否包含只读属性

属性

十进制值

操作

二进制值

十六进制值

N+R

129

&

(And)

1

0

0

0

0

0

0

1

81

ReadOnly

1

0

0

0

0

0

0

0

1

1

ReadOnly

1

0

0

0

0

0

0

0

1

1

现有属性基础上增加某个属性,请使用:现有属性 Or 某个属性:

表10-3 增加隐藏属性

属性

十进制值

操作

二进制值

十六进制值

Normal

128

|

(Or)

1

0

0

0

0

0

0

0

80

Hidden

2

0

0

0

0

0

0

1

0

2

N+H

130

1

0

0

0

0

0

1

0

82

从现有属性中排除某个属性,请使用:现有属性 Xor 某个属性:

表10-4 排除只读属性

属性

十进制值

操作

二进制值

十六进制值

N+R

129

^

(Xor)

1

0

0

0

0

0

0

1

81

ReadOnly

1

0

0

0

0

0

0

0

1

1

Normal

128

1

0

0

0

0

0

0

0

80

注意:微软提供的很多Api常量和.Net常量都类似于FileAttributes常量枚举,即按照 0、1、2、4、8……这样定义的,很方便使用&、|、^等位运算符。

【例 10.4【项目:code10-004】设置目录属性。

        //选择目录,并获得其属性

        private void button1_Click(object sender, EventArgs e)

        {

            FolderBrowserDialog fbd = new FolderBrowserDialog();

            if (fbd.ShowDialog() != DialogResult.OK)

                return;

            label1.Text = fbd.SelectedPath;

            DirectoryInfo di = new DirectoryInfo(label1.Text);

            //目录有只读属性,那么勾选CheckBox1

            if ((di.Attributes & FileAttributes.ReadOnly) ==FileAttributes.ReadOnly )

                checkBox1.Checked = true;

            //目录有隐藏属性,那么勾选CheckBox2

            if ((di.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden)

                checkBox2.Checked = true;

            //目录有系统属性,那么勾选CheckBox3

            if ((di.Attributes & FileAttributes.System) == FileAttributes.System)

                checkBox3.Checked = true;

        }

        //设置指定目录的属性

        private void button2_Click(object sender, EventArgs e)

        {

            DirectoryInfo di = new DirectoryInfo(label1.Text);

            if (di.Exists == false)

                return;

            FileAttributes fa = di.Attributes;

            if ((fa & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)

            {

                //如果有只读属性,而设置取消只读,那么使用异或方式

                if (checkBox1.Checked == false)

                    fa = fa ^ FileAttributes.ReadOnly;

            }

           else

            {

                //如果没有只读属性,而设置只读,那么使用或方式

                if (checkBox1.Checked == true)

                    fa = fa | FileAttributes.ReadOnly;

            }

            if ((fa & FileAttributes.Hidden) == FileAttributes.Hidden)

            {

                //如果有隐藏属性,而设置取消隐藏,那么使用异或方式

                if (checkBox2.Checked == false)

                    fa = fa ^ FileAttributes.Hidden;

            }

            else

            {

                //如果没有隐藏属性,而设置隐藏,那么使用或方式

                if (checkBox2.Checked == true)

                    fa = fa | FileAttributes.Hidden;

            }

            if ((fa & FileAttributes.System) == FileAttributes.System)

            {

                //如果有系统属性,而设置取消系统,那么使用异或方式

                if (checkBox3.Checked == false)

                    fa = fa ^ FileAttributes.System;

            }

            else

            {

                //如果没有系统属性,而设置系统,那么使用或方式

                if (checkBox3.Checked == true)

                    fa = fa | FileAttributes.System;

            }

            //目录设置新属性

            di.Attributes = fa;

        }

运行结果如下图所示:

图10-4 设置目录属性并使用attrib命令验证

10.2.1.4 目录的创建、删除和移动

目录的创建、删除和移动分别使用到了DirectoryInfo类的Create、Delete和MoveTo方法。

【例 10.5【项目:code10-005】目录的创建、删除和移动。

        //获得源目录路径

        private void button1_Click(object sender, EventArgs e)

        {

            FolderBrowserDialog fbd = new FolderBrowserDialog();

            if (fbd.ShowDialog() != DialogResult.OK)

                return;

            label1.Text = fbd.SelectedPath;

        }

        //获得目标目录路径

        private void button2_Click(object sender, EventArgs e)

        {

            FolderBrowserDialog fbd = new FolderBrowserDialog();

            if (fbd.ShowDialog() != DialogResult.OK)

                return;

            label2.Text = fbd.SelectedPath;

        }

        //在源目录下创建一个子目录 csharp

        private void button3_Click(object sender, EventArgs e)

        {

            if (label1.Text == "")

                return;

            string newFolder = label1.Text.Substring(label1.Text.Length - 1, 1) == "\\" ?

                label1.Text.Substring(0, label1.Text.Length - 1) :

                label1.Text;

            DirectoryInfo di = new DirectoryInfo(newFolder + "\\csharp");

            if(di.Exists )

            {

                MessageBox.Show("目录已经存在,不能创建该目录。", "错误信息");

                return;

            }

            di.Create();

            MessageBox.Show("目录创建成功。", "提示信息");

        }

        //删除源目录

        private void button4_Click(object sender, EventArgs e)

        {

            if (label1.Text == "")

                return;

            DirectoryInfo di = new DirectoryInfo(label1.Text );

            if (di.Parent == null)

            {

                MessageBox.Show("为确保文件安全,不允许删除根目录", "错误信息");

                return;

            }

            if(di.Exists )

            {

                try

                {

                    if (MessageBox.Show("确实要删除此目录?", "警告信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel)

                        return;

                    di.Delete(true);

                    MessageBox.Show("目录已经成功删除。", "提示信息");

                }

                catch(Exception ex)

                {

                    MessageBox.Show("删除目录时发生错误:" + ex.Message, "错误信息");

                }

            }

            else

            {

                MessageBox.Show("目录不存在。", "错误信息");

            }

        }

        //移动源目录到目标目录,注意:必须在同一分区下移动

        private void button5_Click(object sender, EventArgs e)

        {

            if (label1.Text == "" | label2.Text == "")

                return;

            DirectoryInfo di = new DirectoryInfo(label1.Text);

            string toFolder;

            toFolder = label2.Text.Substring(label2.Text.Length - 1, 1) == "\\" ? label2.Text : label2.Text + "\\";

            toFolder = toFolder + di.Name;

            if(di.Exists)

            {

                try

                {

                    di.MoveTo(toFolder);

                    MessageBox.Show("目录移动完成。", "提示信息");

                }

                catch(Exception ex)

                {

                    MessageBox.Show("移动目录时发生错误:"+ ex.Message, "错误信息");

                }

            }

            else

            {

                MessageBox.Show("目录不存在。", "错误信息");

            }

        }

运行结果如下图所示:

图10-5目录的创建、删除和移动

10.2.2 Directory类

除了DirictoryInfo类外,VB.Net还提供了Directory类来操作目录、获得目录信息。

Directory类与DirectoryInfo类相比,Directory没有属性,提供的方法都是静态方法,可以直接使用;而DirectoryInfo的方法需要类实例化后使用。

其实DirectoryInfo的一些方法甚至就是调用Directory对应的方法。

Directory常用方法:

  1. CreateDirectory:创建目录。
  2. Delete:删除目录。
  3. Move:移动目录。
  4. GetLogicalDrives:检索此计算机上格式为“<驱动器号>:\”的逻辑驱动器的名称,这是一个字符串数组。
  5. GetDirectories:子目录的名称(包括其路径),这是一个字符串数组。
  6. GetFiles:目录中文件的名称(包括其路径),这是一个字符串数组。
  7. GetCreationTime:获得目录创建时间。
  8. GetLastWriteTime:获得目录最后修改时间。
  9. GetLastAccessTime:获得目录最后访问时间。
  10. GetParent:获得父目录,这是一个DirectoryInfo类型。
  11. SetCreationTime:设置目录创建时间。
  12. SetLastWriteTime:设置目录最后修改时间。
  13. SetLastAccessTime:设置目录最后访问时间。
  14. GetCurrentDirecotry:获得程序所在路径。
  15. Exists:目录是否存在。
10.2.2.1 获取目录信息

【例 10.6【项目:code10-006】获取某个目录的信息。

        private void button1_Click(object sender, EventArgs e)

        {

            FolderBrowserDialog fbd = new FolderBrowserDialog();

            fbd.ShowNewFolderButton = false;

            if (fbd.ShowDialog() !=DialogResult.OK)

                return;

            string folderPath = fbd.SelectedPath;

            textBox1.Text += "路径:" + folderPath + "\r\n";

            textBox1.Text += "根目录:" + Directory.GetDirectoryRoot(folderPath) + "\r\n";

            if (Directory.GetParent(folderPath)!=null)

                textBox1.Text += "父目录:" + Directory.GetParent(folderPath).FullName + "\r\n";           

            textBox1.Text += "创建日期:" + Directory.GetCreationTime(folderPath).ToString("yyyy-MM-dd") + "\r\n";

            textBox1.Text += "最后修改日期:" + Directory.GetLastWriteTime(folderPath).ToString("yyyy-MM-dd") + "\r\n";

            textBox1.Text += "最后访问日期:" + Directory.GetLastAccessTime(folderPath).ToString("yyyy-MM-dd");

        }

运行结果如下图所示:

图10-6 获取目录信息

10.2.2.2 获取子目录和文件

获取当前目录的子目录和所有文件主要是使用GetDirectories和GetFiles方法,这两个方法不同于DirectoryInfo类提供的方法,它们返回的是包含的子目录和文件的全路径的字符串数组。

【例 10.7【项目:code10-007】获得子目录和文件。

         private void button1_Click(object sender, EventArgs e)

        {

            FolderBrowserDialog fbd = new FolderBrowserDialog();

            if (fbd.ShowDialog() != DialogResult.OK)

                return;

            listBox1.Items.Clear();

            string selPath = fbd.SelectedPath;

            //遍历所有的子目录

            foreach ( string subdirectory in Directory.GetDirectories(selPath))

            {

                listBox1.Items.Add("目录" + subdirectory);

            }

            //遍历所有的文件

            foreach (string file in Directory.GetFiles(selPath))

            {

                listBox1.Items.Add("文件" + file);

            }

        }

运行结果同【例 10.3】。

10.2.2.3 目录的创建、删除和移动

目录的创建、删除和移动分别使用到了Directory类的CreateDirectory、Delete和Move方法。

【例 10.8【项目:code10-008】目录的创建、删除和移动。

        //获得源目录路径

        private void button1_Click(object sender, EventArgs e)

        {

            FolderBrowserDialog fbd = new FolderBrowserDialog();

            if (fbd.ShowDialog() != DialogResult.OK)

                return;

            label1.Text = fbd.SelectedPath;

        }

        //获得目标目录路径

        private void button2_Click(object sender, EventArgs e)

        {

            FolderBrowserDialog fbd = new FolderBrowserDialog();

            if (fbd.ShowDialog() != DialogResult.OK)

                return;

            label2.Text = fbd.SelectedPath;

        }

        //在源目录下创建一个子目录 csharp

        private void button3_Click(object sender, EventArgs e)

        {

            string newFolder = label1.Text.Substring(label1.Text.Length - 1, 1) == "\\" ? label1.Text.Substring(0, label1.Text.Length - 1) : label1.Text;

            newFolder += "\\csharp";

            if (Directory.Exists(newFolder))

            {

                MessageBox.Show("目录已经存在,不能创建该目录。", "错误信息");

                return;

            }

            Directory.CreateDirectory(newFolder);

            MessageBox.Show("目录创建成功。", "提示信息");

        }

        //删除源目录

        private void button4_Click(object sender, EventArgs e)

        {

            if (label1.Text == "")

                return;

            string folder = label1.Text;

            if (Directory.GetParent(folder) == null)

                MessageBox.Show("为确保文件安全,不允许删除根目录", "错误信息");

                return;

            if(Directory.Exists (folder))

            {

                try

                {

                    if (MessageBox.Show("确实要删除此目录?", "警告信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.Cancel)

                        return;

                    //调用Delete方法删除,参数True表示要删除该目录中的子目录和文件

                    Directory.Delete(folder, true);

                    //如果使用不带参数的方法只能是删除空目录

                    Directory.Delete(folder);

                    MessageBox.Show("目录已经成功删除。", "提示信息");

                }

                catch(Exception ex)

                {

                    MessageBox.Show("删除目录时发生错误:" + ex.Message, "错误信息");

                }

            }

            else

            {

                MessageBox.Show("目录不存在。", "错误信息");

            }

        }

         //移动源目录到目标目录

         //注意必须在同一分区下移动

        private void button5_Click(object sender, EventArgs e)

        {

            if (label1.Text == "" | label2.Text == "")

                return;

            DirectoryInfo di = new DirectoryInfo(label1.Text);

            string toFolder = label2.Text.Substring(label2.Text.Length - 1, 1) == "\\" ? label2.Text : label2.Text + "\\";

            toFolder += di.Name;

            if(Directory.Exists(label1.Text))

            {

                try

                {

                    //调用MoveTo方法移动

                    Directory.Move(label1.Text, toFolder);

                    MessageBox.Show("目录移动完成。", "提示信息");

                }

                catch (Exception ex)

                {

                    MessageBox.Show("移动目录时发生错误:" + ex.Message, "错误信息");

                }

            }

            else

            {

                MessageBox.Show("目录不存在。", "错误信息");

            }

        }

运行结果同【例 10.5】。

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录

相关文章:

10.2 目录(文件夹)操作

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 10.2.1 DirectoryInfo类 DirectoryInfo类可以获得目录信息。 DirectoryInfo常用属性&#xff1a; Name&#xff1a;获取Director…...

LiteFlow Spring boot使用方式

文章目录 概述LiteFlow框架的优势规则调用逻辑规则组件定义组件内数据获取通过 DefaultContext自定义上下文 通过 组件规则定义数据通过预先传入数据 liteflow 使用 概述 在每个公司的系统中&#xff0c;总有一些拥有复杂业务逻辑的系统&#xff0c;这些系统承载着核心业务逻…...

OSCP:Windows 服务提权详解

在Windows操作系统中&#xff0c;服务是一种特殊的后台进程&#xff0c;它们通常以较高的权限&#xff08;如 SYSTEM 或 Administrator&#xff09;运行。攻击者可以通过控制服务的创建、配置或运行过程实现权限提升&#xff08;提权&#xff09;。本文将详细分析Windows服务提…...

星火大模型接入及文本生成HTTP流式、非流式接口(JAVA)

文章目录 一、接入星火大模型二、基于JAVA实现HTTP非流式接口1.配置2.接口实现&#xff08;1&#xff09;分析接口请求&#xff08;2&#xff09;代码实现 3.功能测试&#xff08;1&#xff09;测试对话功能&#xff08;2&#xff09;测试记住上下文功能 三、基于JAVA实现HTTP流…...

21.Word:小赵-毕业论文排版❗【39】

目录 题目​ NO1.2 NO3.4 NO5.6 NO7.8.9 NO10.11.12 题目 NO1.2 自己的论文当中接收老师的修改&#xff1a;审阅→比较→源文档&#xff1a;考生文件夹&#xff1a;Word.docx→修订的文档&#xff1a;考生文件夹&#xff1a;教师修改→确定→接收→接收所有修订将合并之…...

Python中的函数(上)

Python中的函数是非常重要的编程概念&#xff0c;以下是详细的介绍&#xff1a; 函数定义基础 在Python中&#xff0c;函数是组织好的、可重复使用的代码块&#xff0c;用于执行特定任务。通过函数&#xff0c;我们可以将复杂的程序分解为较小的、更易管理的部分&#xff0c…...

Windows11 安装poetry

使用powershell安装 (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py - 如果使用py运行失败则替换为python即可 终端运行结果如下 D:\AI\A_Share_investment_Agent> (Invoke-WebRequest -Uri https://install.python-poetry.…...

浅谈Linux 权限、压缩、进程与服务

概述 放假回家&#xff0c;对Linux系统的一些知识进行重新的整理&#xff0c;做到温故而知新&#xff0c;对用户权限管理、文件赋权、压缩文件、进程与服务的知识进行了一次梳理和总结。 权限管理 Linux最基础的权限是用户和文件&#xff0c;先了解基础的用户权限和文件权限…...

006 LocalStorage和SessionStorage

JWT存储在LocalStorage与SessionStorage里的区别和共同点如下&#xff1a; 区别 数据有效期&#xff1a; • LocalStorage&#xff1a;始终有效&#xff0c;存储的数据会一直保留在浏览器中&#xff0c;即使窗口或浏览器关闭也一直保存&#xff0c;因此常用作持久数据。 • Se…...

AJAX RSS Reader:技术解析与应用场景

AJAX RSS Reader:技术解析与应用场景 引言 随着互联网的快速发展,信息量呈爆炸式增长。为了方便用户快速获取感兴趣的信息,RSS(Really Simple Syndication)技术应运而生。AJAX RSS Reader作为一种基于AJAX技术的信息读取工具,在用户体验和信息获取方面具有显著优势。本…...

Go优雅实现redis分布式锁

前言 系统为了保证高可用&#xff0c;通常会部署多实例&#xff0c;并且会存在同时对共享资源并发读写&#xff0c;这时候为了保证读写的安全&#xff0c;常规手段是会引入分布式锁&#xff0c;本文将介绍如何使用redis设计一个优雅的Go分布式锁。 设计 redis分布式锁是借助…...

本地部署deepseek模型步骤

文章目录 0.deepseek简介1.安装ollama软件2.配置合适的deepseek模型3.安装chatbox可视化 0.deepseek简介 DeepSeek 是一家专注于人工智能技术研发的公司&#xff0c;致力于打造高性能、低成本的 AI 模型&#xff0c;其目标是让 AI 技术更加普惠&#xff0c;让更多人能够用上强…...

(2025 年最新)MacOS Redis Desktop Manager中文版下载,附详细图文

MacOS Redis Desktop Manager中文版下载 大家好&#xff0c;今天给大家带来一款非常实用的 Redis 可视化工具——Redis Desktop Manager&#xff08;简称 RDM&#xff09;。相信很多开发者都用过 Redis 数据库&#xff0c;但如果你想要更高效、更方便地管理 Redis 数据&#x…...

C++ 写一个简单的加减法计算器

************* C topic&#xff1a;结构 ************* Structure is a very intersting issue. I really dont like concepts as it is boring. I would like to cases instead. If I want to learn something, donot hesitate to make shits. Like building a house. Wh…...

计算机网络基础 - 链路层(3)

计算机网络基础 链路层和局域网交换局域网链路层寻址地址解析协议 ARP以太网物理拓扑以太网帧结构以太网提供的服务以太网标准 链路层交换机交换机转发和过滤自学习交换机优点交换机和路由器比较 大家好呀&#xff01;我是小笙&#xff0c;本章我主要分享计算机网络基础 - 链路…...

ray.rllib 入门实践-5: 训练算法

前面的博客介绍了ray.rllib中算法的配置和构建&#xff0c;也包含了算法训练的代码。 但是rllib中实现算法训练的方式不止一种&#xff0c;本博客对此进行介绍。很多教程使用 PPOTrainer 进行训练&#xff0c;但是 PPOTrainer 在最近的 ray 版本中已经取消了。 环境配置&#x…...

FPGA 使用 CLOCK_LOW_FANOUT 约束

使用 CLOCK_LOW_FANOUT 约束 您可以使用 CLOCK_LOW_FANOUT 约束在单个时钟区域中包含时钟缓存负载。在由全局时钟缓存直接驱动的时钟网段 上对 CLOCK_LOW_FANOUT 进行设置&#xff0c;而且全局时钟缓存扇出必须低于 2000 个负载。 注释&#xff1a; 当与其他时钟约束配合…...

选择的阶段性质疑

条条大路通罗马&#xff0c;每个人选择的道路&#xff0c;方向并不一样&#xff0c;但不妨碍都可以到达终点&#xff0c;而往往大家会更推崇自己走过的路径。 自己靠什么走向成功&#xff0c;自己用了什么方法&#xff0c;奉行什么原则或者理念&#xff0c;也会尽可能传播这种&…...

固有频率与模态分析

目录 引言 1. 固有频率&#xff1a;物体的“天生节奏” 1.1 定义 1.2 关键特点 1.3 实际意义 2. 有限元中的模态分析&#xff1a;给结构“体检振动” 2.1 模态分析的意义 2.2 实际案例 2.2.1 桥梁模态分析 2.2.2 飞机机翼模态分析 2.2.3 具体事例 3. 模态分析的工具…...

数科OFD证照生成原理剖析与平替方案实现

一、 引言 近年来&#xff0c;随着电子发票的普及&#xff0c;OFD格式作为我国电子发票的标准格式&#xff0c;其应用范围日益广泛。然而&#xff0c;由于不同软件生成的OFD文件存在差异&#xff0c;以及用户对OFD文件处理需求的多样化&#xff0c;OFD套餐转换工具应运而生。本…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...