Flutter笔记:目录与文件存储以及在Flutter中的使用(上)
作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263
邮箱 :291148484@163.com
本文地址:https://blog.csdn.net/qq_28550263/article/details/134499297
【简介】本文探讨了Dart和Flutter中的文件系统操作和文件存储。内容覆盖了Dart的文件系统基础,文件路径处理,文件读写操作及其优化(上),以及在Flutter中的文件读写相关注意的事项(下)。
目 录
- 1. 概述
- 2. Dart文件系统基础
- 2.1 文件(File)
- 2.2 目录(Directory)
- 2.2.1 目录的概念
- 2.2.2 目录的操作
- 创建目录
- 列出目录内容
- 删除目录
- 2.2.3 一个注意点:关于目录的字符串表示
- 2.3 链接(Link)
- 2.3.1 链接的概念
- 2.3.2 硬链接 和 软链接
- 1. 硬链接
- 2. 软链接
- 2.3.3 链接的操作
- 创建链接
- 获取链接的目标
- 更新链接的目标
- 删除链接
- 3. Dart文件路径操作
1. 概述
本文主要介绍了Dart和Flutter中的文件系统操作和文件存储。首先,我们将探讨Dart中的文件系统基础,包括文件、目录和链接的基本概念及其操作方法。然后,我们将学习如何在Dart中处理文件路径,以及如何进行文件的读写操作。接着,我们将讨论如何在Flutter中进行文件存储,包括如何使用path_provider库来获取应用的文件存储路径,以及如何读写特殊类型的文件。最后,我们将探讨文件读写的性能优化。希望通过本文,你能够对Dart和Flutter中的文件操作有一个全面的了解。
2. Dart文件系统基础
本小节将介绍文件的基本概念、操作方法以及错误处理和异常捕获。
2.1 文件(File)
本小节包括3个子小节,讲解文件的基本概念、操作方法以及错误处理和异常捕获。
2.1.1 文件的概念
文件是存储在磁盘上的数据的集合,可以包含任何类型的数据,如文本、图片、音频等。文件是计算机中用于数据存储的基本单位,它可以包含各种类型的数据,如程序代码、文本文档、图片、音频和视频等。
在 Dart 中,我们可以使用 dart:io 库中的 File 类来操作文件。File类提供了一系列的方法,如 readAsString、writeAsString、readAsBytes、writeAsBytes 等,用于读取和写入文件。这些方法都是异步的,因此在使用它们时,我们需要使用await关键词来等待操作完成。
以下是一个简单的示例,演示如何使用 File 类来创建一个新文件,并向其中写入一些文本:
在这个示例中,我们首先导入了 dart:io 库,然后创建了一个File对象,表示一个名为’test.txt’的文件。然后,我们使用 writeAsString 方法向文件中写入了一些文本。由于 writeAsString 方法是异步的,我们需要使用 await 关键词来等待操作完成。
import 'dart:io';void main() async {var file = File('test.txt');await file.writeAsString('Hello, Dart!');
}
注意,由于我们在 main 函数中使用了 await 关键词,因此我们需要将 main 函数声明为异步函数,即在函数声明前添加 async 关键词。
2.1.2 文件的操作
在 Dart 中,我们可以使用 File 类的各种方法来操作文件,包括创建、读取、写入和删除等操作。
以下是一些常用的文件操作方法的示例:
- 创建文件:使用
create方法可以创建一个新的文件。如果文件已经存在,create方法不会有任何效果。如果你希望覆盖已经存在的文件,可以给create方法传入一个名为recursive的参数,将其设为true。
import 'dart:io';void main() async {var file = File('test.txt');await file.create();
}
- 读取文件:使用
readAsString方法可以读取文件的内容,返回一个字符串。如果文件不存在,readAsString方法会抛出一个异常。
import 'dart:io';void main() async {var file = File('test.txt');String contents = await file.readAsString();print(contents);
}
- 写入文件:使用
writeAsString方法可以向文件中写入字符串。如果文件不存在,writeAsString方法会创建一个新的文件。如果文件已经存在,writeAsString方法会覆盖文件的内容。
import 'dart:io';void main() async {var file = File('test.txt');await file.writeAsString('Hello, Dart!');
}
- 删除文件:使用
delete方法可以删除一个文件。如果文件不存在,delete方法不会有任何效果。
import 'dart:io';void main() async {var file = File('test.txt');await file.delete();
}
在实际使用中,你可能还需要处理各种可能出现的错误和异常,例如文件不存在、没有权限等。这些内容将在后续小节中讲解。
2.1.3 错误处理和异常捕获
在进行文件操作时,可能会出现各种错误和异常,例如文件不存在、没有读写权限等。在 Dart 中,我们可以使用 try-catch 语句来捕获和处理这些错误和异常。
以下是一些常见的错误处理和异常捕获的示例:
- 文件不存在:当我们试图读取或删除一个不存在的文件时,Dart会抛出一个 FileSystemException 异常。我们可以捕获这个异常,然后进行相应的处理,例如创建一个新的文件或者给用户显示一个错误消息。
import 'dart:io';void main() async {var file = File('test.txt');try {String contents = await file.readAsString();print(contents);} catch (e) {print('Error: $e');}
}
在这个示例中,如果 ‘test.txt’ 文件不存在,readAsString方法会抛出一个 FileSystemException 异常,然后我们在catch语句中捕获这个异常,并打印一个错误消息。
- 没有读写权限:当我们试图读取或写入一个我们没有权限访问的文件时,Dart 也会抛出一个 FileSystemException 异常。我们可以捕获这个异常,然后进行相应的处理,例如请求用户提供权限或者给用户显示一个错误消息。
import 'dart:io';void main() async {var file = File('/root/test.txt');try {await file.writeAsString('Hello, Dart!');} catch (e) {print('Error: $e');}
}
在这个示例中,如果我们没有权限写入 ‘/root/test.txt’ 文件,writeAsString 方法会抛出一个 FileSystemException 异常,然后我们在 catch 语句中捕获这个异常,并打印一个错误消息。
在实际使用中,可能还需要处理其他类型的错误和异常,例如磁盘空间不足等。处理这些错误和异常的方法和上述示例类似,关键是要正确地识别错误类型,然后进行相应的处理。
2.2 目录(Directory)
本小节将介绍目录的基本概念及其在Dart中的操作方法。
2.2.1 目录的概念
目录是文件的容器,可以包含文件和其他目录。在文件系统中,目录用于组织文件,使得我们可以更方便地管理和访问文件。一个目录可以包含任意数量的文件和子目录。
在 Dart 中,我们可以使用dart:io库中的 Directory 类来操作目录。Directory 类提供了一系列的方法,如create、list、delete等,用于创建、列出和删除目录。这些方法都是异步的,因此在使用它们时,我们需要使用await关键词来等待操作完成。
以下是一个简单的示例,演示如何使用Directory类来创建一个新目录:
import 'dart:io';void main() async {var directory = Directory('test');await directory.create();
}
在这个示例中,我们首先导入了dart:io库,然后创建了一个 Directory 对象,表示一个名为 ‘test’ 的目录。然后,我们使用 create 方法创建了这个目录。由于 create 方法是异步的,我们需要使用 await 关键词来等待操作完成。
注意,由于我们在 main 函数中使用了 await 关键词,因此我们需要将 main 函数声明为异步函数,即在函数声明前添加 async 关键词。
2.2.2 目录的操作
在 Dart 中,我们可以使用 Directory 类的各种方法来操作目录,包括创建、列出内容和删除等操作。
以下是一些常用的目录操作方法的示例:
创建目录
使用 create 方法可以创建一个新的目录。如果目录已经存在,create 方法不会有任何效果。如果你希望创建的目录的父目录不存在,可以给 create 方法传入一个名为 recursive 的参数,将其设为 true。
import 'dart:io';void main() async {var directory = Directory('test');await directory.create();
}
列出目录内容
使用list方法可以列出目录的内容,包括文件和子目录。list 方法返回一个 Stream 对象,我们可以使用 await for 语句来遍历这个 Stream。
import 'dart:io';void main() async {var directory = Directory('test');await for (var entity in directory.list()) {print(entity.path);}
}
注:
await for是一种特殊的循环结构,用于处理异步流。 await for 循环会订阅 提供的流,并等待流生成新的值。
每当流生成新的值,循环体就会使用这个值进行一次迭代。当流关闭时,循环就会结束。
删除目录
使用 delete 方法可以删除一个目录。如果目录不存在,delete 方法不会有任何效果。如果你希望删除的目录包含文件或子目录,可以给 delete 方法传入一个名为 recursive 的参数,将其设为true。
import 'dart:io';void main() async {var directory = Directory('test');await directory.delete();
}
在实际使用中,你可能还需要处理各种可能出现的错误和异常,例如目录不存在、没有权限等。这些内容将在后续的章节中讲解。
2.2.3 一个注意点:关于目录的字符串表示
如果你正在使用的是 Windows 系统,并且上面的代提示一些路径方面的错误,那么或许本小节可以帮助到你。
假设你有一个目录为 D:\SOFTWARES\postgresql(Windows系统上),现在你想输出该目录中所有的文件,如果直接使用这段字符串,那就是:
// 错误示例
import 'dart:io';void main() async {var directory = Directory('D:\SOFTWARES\postgresql');await for (var entity in directory.list()) {print(entity.path);}
}
这是一个错误的写法。因为在 Dart 中,字符串中的反斜杠 \ 是一个特殊字符,用于引入转义序列,因此你需要使用两个反斜杠 \\,那么就是:
var directory = Directory('D:\\SOFTWARES\\postgresql');
但是如果你觉得这样太麻烦了,不想再后动为你复制过来的 Windows 系统上的位置添加这么多的 \ 进行转移,那么就应该使用 原始字符串 (raw string)来避免处理转义字符。
原始字符串以 r 开头,如 r"Hello\nWorld"。在原始字符串中,\ 字符没有特殊含义,所以你可以直接使用 \ 而不是 \\。因此,下面的写法也是正确的:
var directory = Directory(r'D:\SOFTWARES\postgresql');
哦,似乎你知道 Python 等一些语言也是这样的。那就用起来吧。
2.3 链接(Link)
本小节将介绍链接的基本概念以及在Dart中如何操作链接。
2.3.1 链接的概念
链接是指向另一个文件或目录的引用。在文件系统中,链接可以使我们在不复制文件内容的情况下,从不同的位置访问同一个文件。这对于节省存储空间和提高数据管理的效率非常有用。链接可以分为两种类型:硬链接 和 软链接(也被称为 符号链接)。
2.3.2 硬链接 和 软链接
在以前写的另外一篇文章中关于链接有更加详细的介绍,包括如何直接通过命令创建链接 《链接、包管理工具、polyrepo、monorepo以及Lerna 工具的使用》,地址为 https://jclee95.blog.csdn.net/article/details/129903902。感兴趣的读者可以参考。
硬链接和软链接是两种不同类型的链接,它们的主要区别在于指向文件的方式不同。
1. 硬链接
硬链接 是指向文件的物理位置的引用。换句话说,硬链接和它所指向的文件在文件系统中是等价的,它们共享同一块存储空间。这意味着,如果你删除了硬链接,它所指向的文件仍然存在;如果你修改了硬链接的内容,它所指向的文件的内容也会被修改。
2. 软链接
软链接(也称为 符号链接 或 symlink)是指向另一个链接或文件的路径的引用。软链接和它所指向的文件在文件系统中是独立的,它们不共享存储空间。这意味着,如果你删除了软链接,它所指向的文件不会受到影响;如果你修改了软链接的内容,它所指向的文件的内容不会被修改。
在大多数情况下,我们都会使用软链接,因为它更加灵活和方便。然而,在某些情况下,硬链接可能会更有用。例如,如果你希望在不增加存储空间的情况下,从不同的位置访问同一个文件,你可以使用硬链接。
在下一节中,我们将讨论如何在 Dart 中操作链接。
2.3.3 链接的操作
在 Dart 中,我们可以使用Link类的各种方法来操作链接,如 create 和 delete 等。
创建链接
使用 create 方法可以创建一个新的链接。如果链接已经存在,create方法会覆盖已经存在的链接。
import 'dart:io';void main() async {var link = Link('link');await link.create('test.txt');
}
在这个示例中,我们创建了一个新的链接,该链接指向名为 ‘test.txt’ 的文件。
获取链接的目标
使用 target 方法可以获取链接的目标。
import 'dart:io';void main() async {var link = Link('link');String target = await link.target();print(target);
}
在这个示例中,我们获取了链接的目标,并将其打印出来。
更新链接的目标
使用update方法可以更新链接的目标。
import 'dart:io';void main() async {var link = Link('link');await link.update('new_target.txt');
}
在这个示例中,我们更新了链接的目标,将其指向名为 ‘new_target.txt’ 的文件。
删除链接
使用 delete 方法可以删除一个链接。如果链接不存在,delete 方法不会有任何效果。
import 'dart:io';void main() async {var link = Link('link');await link.delete();
}
在这个示例中,我们删除了链接。
3. Dart文件路径操作
3.1 路径的概念
路径是文件或目录在文件系统中的位置。它是一个字符串,由一系列的名称组成,这些名称代表从文件系统的根目录到文件或目录的路径。在路径中,名称之间通常由特殊的字符(如斜杠/或反斜杠\)分隔。
例如,路径 /home/user/documents/report.txt 表示在 home 目录下的 user 目录下的 documents 目录下的 report.txt 文件。
在 Dart 中,我们可以使用字符串来表示路径。例如,我们可以创建一个表示文件路径的字符串,然后使用这个字符串来创建一个 File 对象:
import 'dart:io';void main() {var path = '/home/user/documents/report.txt';var file = File(path);
}
在这个示例中,我们首先创建了一个表示文件路径的字符串,然后使用这个字符串来创建了一个File对象。
【注意】不同的操作系统可能使用不同的字符来分隔路径中的名称。
例如,Unix和Linux系统使用斜杠/,而 Windows 系统使用反斜杠\。
为了编写可移植的代码,我们应该尽可能避免直接在代码中使用这些特殊字符,而是使用Dart提供的路径操作函数,如join。这些函数可以正确地处理不同操作系统的路径分隔符。
3.3 路径的操作
在 Dart 中,我们可以使用 path 库中的各种函数来操作路径。这个库提供了一系列的函数,用于连接路径、获取路径的基名、分割路径等。
3.3.1 连接路径(join)
join 函数可以连接两个或多个路径。它会自动处理路径中的分隔符,使得你的代码可以在不同的操作系统上正确运行。
import 'package:path/path.dart' as path;void main() {var p = path.join('/home/user', 'documents', 'report.txt');print(p); // Outputs: /home/user/documents/report.txt
}
3.3.2 获取路径的基名(basename)
basename 函数可以获取路径的基名,即路径的最后一部分。
import 'package:path/path.dart' as path;void main() {var name = path.basename('/home/user/documents/report.txt');print(name); // Outputs: report.txt
}
3.3.3 分割路径(split)
split函数可以分割路径,将路径分解为它的各个部分。
import 'package:path/path.dart' as path;void main() {var parts = path.split('/home/user/documents/report.txt');print(parts); // Outputs: ['/', 'home', 'user', 'documents', 'report.txt']
}
3.3.4 获取路径的目录名(dirname)
dirname 函数可以获取路径的目录名,即除去最后一部分的路径。
import 'package:path/path.dart' as path;void main() {var dir = path.dirname('/home/user/documents/report.txt');print(dir); // Outputs: /home/user/documents
}
3.3.5 获取路径的扩展名(extension)
extension函数可以获取路径的扩展名,即最后一部分中的点(.)之后的部分。
import 'package:path/path.dart' as path;void main() {var ext = path.extension('/home/user/documents/report.txt');print(ext); // Outputs: .txt
}
3.3.6 判断路径是否为绝对路径(isAbsolute)
isAbsolute 函数可以判断路径是否为绝对路径。绝对路径是从文件系统的根目录开始的路径,而相对路径是从当前目录开始的路径。
import 'package:path/path.dart' as path;void main() {var isAbs = path.isAbsolute('/home/user/documents/report.txt');print(isAbs); // Outputs: true
}
相关文章:
Flutter笔记:目录与文件存储以及在Flutter中的使用(上)
Flutter笔记 目录与文件存储以及在Flutter中的使用(上) 文件系统基础知识与路径操作 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:h…...
注意了!申请流量卡时地址一定不要填写学校,不好下卡哦!
当我们在网上购买流量卡时,都会要求让填写准确的收货地址,但是对于收货地址你填对了吗? 很多朋友在提交流量卡申请之后,往往会被运营商拒审,对于拒审的原因除了比较常见的信息填写有有误、涉及禁发地区、重复申…...
minio使用shell上传文件
minio使用shell上传文件 前言1. 编写调用脚本2.测试脚本上传3.候选脚本 前言 业务场景需要实现,服务器文件上传至存储服务。一种方式是安装minio的linux客户端,另一种方式是通过调用minio的api接口实现文件上传。后一种方式不需要依赖minio的客户端使用…...
LeetCode538. Convert BST to Greater Tree
文章目录 一、题目二、题解 一、题目 Given the root of a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original BST is changed to the original key plus the sum of all keys greater than the original key in BST. As a remin…...
iPaaS和RPA,企业自动化应该如何选择?
全球著名的咨询调查机构Gartner在2022年初再次发布了《2022年12大技术趋势》报告。 Gartner是全球最具权威的IT研究与顾问咨询公司,成立于1979年,在界定及分析那些决定了商业进程的发展趋势与技术方面,它拥有二十年以上的丰富经验,…...
AI实践与学习1_Milvus向量数据库实践与原理分析
前言 随着NLP预训练模型(大模型)以及多模态研究领域的发展,向量数据库被使用的越来越多。 在XOP亿级题库业务背景下,对于试题召回搜索单单靠着ES集群已经出现性能瓶颈,因此需要预研其他技术方案提高试题搜索召回率。…...
3Dexcite deltgen 2022x 新功能
3DEXCITE DELTAGEN 2022x 现已发布,此次新版发布包含 DELTAGEN 2022x,DELTAGEN MARKETING SUITE 2022x,DELTAGEN XPLORE 2022x,以及软件开发工具包 SDK FOR DELTAGEN 2022x 版本。赶快来获取最新 DG 版本,了解新增内容…...
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形 文章链接:柱状图中最大的矩形 视频链接:柱状图中最大的矩形 1. LeetCode 84. 柱状图中最大的矩形 1.1 思路 本题是给一个数组形象得画出图后求矩形的最大面积是多少。本题和42. 接雨水…...
【2023云栖】陈守元:阿里云开源大数据产品年度发布
本文根据 2023 云栖大会演讲实录整理而成,演讲信息如下: 演讲人:陈守元 | 阿里云计算平台事业部开源大数据产品总监 演讲主题:阿里云开源大数据产品年度发布 随着云计算的不断发展,未来数据处理和应用的趋势将围绕C…...
Element UI 禁用数字输入框组件添加鼠标滚动事件
Element UI 禁用数字输入框组件添加鼠标滚动事件 <el-input type"number" mousewheel.native.prevent DOMMouseScroll.native.prevent :min"0" onkeyup"this.valuethis.value.match(/\d\.?\d{0,2}/);"v-model"form.threeYearDevelop…...
担忧CentOS停服?KeyarchOS系统来支撑
担忧CentOS停服?KeyarchOS系统来支撑 近年发生的“微软黑屏门”、“微软操作系统停更”等安全事件,敲响了我国 IT 产业的警钟,建立由我国主导的 IT 产业生态尤为迫切。对此,我国信息技术应用创新行业乘势而起,旨在通过…...
聚观早报 |联想集团Q2财季业绩;小鹏汽车Q3营收
【聚观365】11月17日消息 联想集团Q2财季业绩 小鹏汽车Q3营收 微软发布两款自研AI芯片 FAA批准SpaceX再次发射星际飞船 2023 OPPO开发者大会 联想集团Q2财季业绩 全球数字经济领导企业联想集团公布截至2023年9月30日的2023/24财年第二财季业绩:整体营收达到10…...
SAP ABAP权限控制中常用TCODE
权限控制中的几个TCODE 1.创建新的权限对象并在程序中使用 利用SU21创建权限对象Z_TEST,在程序中检查授权。 检查的代码如下: AUTHORITY-CHECK OBJECT ‘Z_TEST’ID ‘ACTION’ FIELD ‘44′ID ‘BUKRS’ FIELD DUMMY .IF sy-subrc NE 0.MESSAGE e00…...
云计算赛项容器云2023搭建
部署容器云平台[5 分] 使 用 OpenStack 私 有 云 平 台 创 建 两 台 云 主 机 , 云 主 机 类 型 使 用 4vCPU/12G/100G 类型,分别作为 Kubernetes 集群的 Master 节点和 node 节点, 然后完成 Kubernetes 集群的部署,并完成 Istio …...
11.1 文件拷贝移动与删除
在编程中,针对磁盘与目录的操作也是非常重要的,本章将重点介绍如何实现针对文件目录与磁盘的操作方法,其中包括了删除文件,文件拷贝,文件读写,目录遍历输出,遍历磁盘容量信息,磁盘格…...
redhat下使用CentOS yum源,并安装docker
一、安装yum源 1.卸载yum # 查看系统自身安装的yum软件包 rpm -qa | grep yum # 卸载软yum件包 rpm -e 软件包名称 --nodeps #可以使用简称如 rpm -e yum-* --nodeps2. 安装yum [rootbogon ~]# rpm -ivh --nodeps https://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/Pa…...
基于单片机体温脉搏检测控制系统及源程序
一、系统方案 1、本设计采用51单片机作为主控器。 2、DS18B20传感器检测体温。 3、红外对接管采集心率值送到液晶1602显示。 二、硬件设计 原理图如下: 三、单片机软件设计 1、首先是系统初始化 /lcd1602初始化设置*/ void init_1602() { write_com(0x38); //显示…...
MyBatis-Plus逻辑删@TableLogic
MyBatis-Plus逻辑删除指,在数据库中删除数据时,并没有真正的删除,而是更改指定字段的值,这个字段的值可以为0或1,0代表未删除,1代表已删除,所以delete操作实际上是update操作,查询操作也是要加w…...
本地私域线上线下 线上和线下的小程序
私域商城是一种新型的零售模式,它将传统的线下实体店与线上渠道相结合,通过会员、营销、效率等方式,为消费者提供更加便利和高效的购物体验。私域商城的发展趋势表明,它将成为未来零售业的重要模式,引领零售业的创新和…...
【前端学java】java中的Object类(8)
往期回顾: 【前端学java】JAVA开发的依赖安装与环境配置 (0)【前端学 java】java的基础语法(1)【前端学java】JAVA中的packge与import(2)【前端学java】面向对象编程基础-类的使用 (…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
