Linux-应用编程学习笔记(三、文件属性和目录)

一、文件类型

1、普通文件(ls -l 文件,权限前边第一个"-"代表普通文件;stat 文件)

文本文件:ASCII字符

二进制文件:数字0/1

2、目录文件(‘’d):文件夹

3、字符设备文件(‘c’)和块设备文件(‘b’):驱动文件

4、符号链接文件(‘l’):快捷方式文件

5、管道文件(‘p’):进程间通信

6、套接字文件(‘s’):进程间通信(网络通信)

二、查看文件属性

1、stat函数(从文件名获得文件属性信息,不需要打开文件)

//获取文件属性,系统调用
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *buf);

pathname: 用于指定一个需要查看属性的文件路径。
buf: struct stat 类型指针,用于指向一个 struct stat 结构体变量。调用 stat 函数的时候需要传入一个 struct stat 变量的指针, 获取到的文件属性信息就记录在 struct stat 结构体中。
返回值: 成功返回 0;失败返回-1,并设置 error。

struct stat
{
    dev_t st_dev; /* 文件所在设备的 ID */
    ino_t st_ino; /* 文件对应 inode 节点编号 */
    mode_t st_mode; /* 文件对应的模式 */
    nlink_t st_nlink; /* 文件的链接数 */
    uid_t st_uid; /* 文件所有者的用户 ID */
    gid_t st_gid; /* 文件所有者的组 ID */
    dev_t st_rdev; /* 设备号(指针对设备文件) */
    off_t st_size; /* 文件大小(以字节为单位) */
    blksize_t st_blksize; /* 文件内容存储的块大小 */
    blkcnt_t st_blocks; /* 文件内容所占块数 */
    struct timespec st_atim; /* 文件最后被访问的时间 */
    struct timespec st_mtim; /* 文件内容最后被修改的时间 */
    struct timespec st_ctim; /* 文件状态最后被改变的时间 */
};

文件属性:

O 对应的 3 个 bit 位用于描述其它用户的权限;
G 对应的 3 个 bit 位用于描述同组用户的权限;
U 对应的 3 个 bit 位用于描述文件所有者的权限;
S 对应的 3 个 bit 位用于描述文件的特殊权限。

文件类型:(8进制)
S_IFSOCK 0140000 socket(套接字文件)
S_IFLNK 0120000 symbolic link(链接文件)
S_IFREG 0100000 regular file(普通文件)
S_IFBLK 0060000 block device(块设备文件)
S_IFDIR 0040000 directory(目录)
S_IFCHR 0020000 character device(字符设备文件)
S_IFIFO 0010000 FIFO(管道文件)

时间属性:

struct timespec
{
    time_t tv_sec; /* 秒 */
    syscall_slong_t tv_nsec; /* 纳秒 */
};

2、fstat(从文件描述符获得文件属性信息,需要打开文件)

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *buf);

pathname: 用于指定一个需要查看属性的文件路径。
buf: struct stat 类型指针,用于指向一个 struct stat 结构体变量。调用 stat 函数的时候需要传入一个 struct stat 变量的指针, 获取到的文件属性信息就记录在 struct stat 结构体中,稍后给大家介绍 struct stat 结构体中有记录了哪些信息。
返回值: 成功返回 0;失败返回-1,并设置 error。

3、lstat(查询链接文件本身的属性)

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int lstat(const char *pathname, struct stat *buf);

三、文件属主

实际用户 ID 和实际组 ID 确定了进程所属的用户和组。

1、chown

//系统调用,该系统调用可用于改变文件的所有者(用户 ID)和所属组(组 ID)

#include <unistd.h>
int chown(const char *pathname, uid_t owner, gid_t group);


pathname: 用于指定一个需要修改所有者和所属组的文件路径。
owner: 将文件的所有者修改为该参数指定的用户(以用户 ID 的形式描述) ;
group: 将文件的所属组修改为该参数指定的用户组(以用户组 ID 的形式描述);
返回值: 成功返回 0;失败将返回-1,兵并且会设置 errno。

⚫ 只有超级用户进程能更改文件的用户 ID;
⚫ 普通用户进程可以将文件的组 ID 修改为其所从属的任意附属组 ID,前提条件是该进程的有效用
户 ID 等于文件的用户 ID;而超级用户进程可以将文件的组 ID 修改为任意值。
//用于获取当前进程的用户 ID 和用户组ID

#include <unistd.h>
#include <sys/types.h>
uid_t getuid(void);
gid_t getgid(void);

2、fchown、lchown

与fsta、lstat、stat区别相似。

四、文件访问权限

1、普通权限

普通权限包括对文件的读、写以及执行。

-rwxrwxr-x:r读,w写,x执行,-无权限。

2、特殊权限

特殊权限则包括一些对文件的附加权限,譬如Set-User-ID、Set-Group-ID以及Sticky。

  • 当进程对文件进行操作的时候、将进行权限检查,如果文件的 set-user-ID 位权限被设置,内核会将进程的有效 ID 设置为该文件的用户 ID(文件所有者 ID) ,意味着该进程直接获取了文件所有者的权限、以文件所有者的身份操作该文件。
  • 当进程对文件进行操作的时候、将进行权限检查,如果文件的 set-group-ID 位权限被设置,内核会将进程的有效用户组 ID 设置为该文件的用户组 ID(文件所属组 ID) ,意味着该进程直接获取了文件所属组成员的权限、以文件所属组成员的身份操作该文件。

3、目录权限

  • 目录的读权限: 可列出(譬如:通过 ls 命令) 目录之下的内容(即目录下有哪些文件)。
  • 目录的写权限: 可以在目录下创建文件、删除文件。
  • 目录的执行权限: 可访问目录下的文件,譬如对目录下的文件进行读、写、执行等操作。
     

4、检查文件权限access

//系统调用
#include <unistd.h>
int access(const char *pathname, int mode);

pathname: 需要进行权限检查的文件路径。
mode: 该参数可以取以下值:
⚫ F_OK:检查文件是否存在
⚫ R_OK:检查是否拥有读权限
⚫ W_OK:检查是否拥有写权限
⚫ X_OK:检查是否拥有执行权限

返回值: 检查项通过则返回 0,表示拥有相应的权限并且文件存在;否则返回-1,如果多个检查项组合
在一起,只要其中任何一项不通过都会返回-1。

5、修改文件权限

  • chmod
//系统调用
#include <sys/stat.h>
int chmod(const char *pathname, mode_t mode);

pathname: 需要进行权限修改的文件路径,若该参数所指为符号链接,实际改变权限的文件是符号链接所指向的文件,而不是符号链接文件本身。
mode: 该参数用于描述文件权限,与 open 函数的第三个参数一样,可以直接使用八进制数据来描述,也可以使用相应的权限宏(单个或通过位或运算符" | "组合)。
返回值: 成功返回 0;失败返回-1,并设置 errno。
  • fchmod
//在于使用了文件描述符来代替文件路径
#include <sys/stat.h>
int fchmod(int fd, mode_t mode);

6、查看/设置权限掩码umask

权限掩码主要用于对新建文件的权限进行屏蔽。权限掩码的表示方式与文件权限的表示方式相同, 但是需要去除特殊权限位, umask 不能对特殊权限位进行屏蔽。

//系统调用
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);

mask: 需要设置的权限掩码值,可以发现 make 参数的类型与 open 函数、 chmod 函数中的 mode 参数
对应的类型一样,所以其表示方式也是一样的,既可以使用数字表示(譬如八进制数),也可以直接使用宏(S_IRUSR、 S_IWUSR 等)。
返回值: 返回设置之前的 umask 值,也就是旧的 umask。

五、文件的时间属性

  • 文件最后被访问的时间: 访问指的是读取文件内容,文件内容最后一次被读取的时间,譬如使用read()函数读取文件内容便会改变该时间属性;
  • 文件内容最后被修改的时间: 文件内容发生改变,譬如使用 write()函数写入数据到文件中便会改变该时间属性;
  • 文件状态最后被改变的时间: 状态更改指的是该文件的 inode 节点最后一次被修改的时间,譬如更改文件的访问权限、更改文件的用户 ID、用户组 ID、更改链接数等,但它们并没有更改文件的实际内容,也没有访问(读取)文件内容。

1、utime()、utimes()

//系统调用
#include <sys/types.h>
#include <utime.h>
int utime(const char *filename, const struct utimbuf *times);

filename: 需要修改时间属性的文件路径。
times: 将时间属性修改为该参数所指定的时间值, times 是一个 struct utimbuf 结构体类型的指针,如果将 times 参数设置为 NULL,则会将文件的访问时间和修改时间设置为系统当前时间。
返回值: 成功返回值 0;失败将返回-1,并会设置 errno。

struct utimbuf {
    time_t actime; /* 访问时间 */
    time_t modtime; /* 内容修改时间 */
};

以下两种进程可对其进行修改:
⚫ 超级用户进程(以 root 身份运行的进程) 。
⚫ 有效用户 ID 与该文件用户 ID(文件所有者)相匹配的进程。
⚫ 在参数 times 等于 NULL 的情况下,对文件拥有写权限的进程。



//系统调用
#include <sys/time.h>
int utimes(const char *filename, const struct timeval times[2]);

filename: 需要修改时间属性的文件路径。
times: 将时间属性修改为该参数所指定的时间值, times 是一个 struct timeval 结构体类型的数组, 数组共有两个元素, 第一个元素用于指定访问时间,第二个元素用于指定内容修改时间,如果times 参数为 NULL,则会将文件的访问时间和修改时间设置为当前时间。
返回值: 成功返回 0;失败返回-1,并且会设置 errno。


struct timeval {
    long tv_sec; /* 秒 */
    long tv_usec; /* 微秒 */
};

2、futimens()、utimensat()

  • 可按纳秒级精度设置时间戳。 
  • 单独设置某一时间戳。譬如,只设置访问时间、而修改时间保持不变,如果要使用 utime()或 utimes()来实现此功能,则需要首先使用 stat()获取另一个时间戳的值,然后再将获取值与打算变更的时间戳一同指定。
  • 独立将任一时间戳设置为当前时间。使用 utime()或 utimes()函数虽然也可以通过将 times 参数设置为 NULL 来达到将时间戳设置为当前时间的效果,但是不能单独指定某一个时间戳,必须全部设置为当前时间(不考虑使用额外函数获取当前时间的方式,譬如 time())。
//系统调用,需要打开文件
#include <fcntl.h>
#include <sys/stat.h>
int futimens(int fd, const struct timespec times[2]);

fd: 文件描述符。
times: 将时间属性修改为该参数所指定的时间值, times 指向拥有 2 个 struct timespec 结构体类型变量的数组,数组共有两个元素, 第一个元素用于指定访问时间,第二个元素用于指定内容修改时间。
返回值: 成功返回 0;失败将返回-1,并设置 errno。

使用 futimens()函数只有以下进程,可对文件时间戳进行修改:
⚫ 超级用户进程。
⚫ 在参数 times 等于 NULL 的情况下,对文件拥有写权限的进程。
⚫ 有效用户 ID 与该文件用户 ID(文件所有者)相匹配的进程。



//系统调用,不需要打开文件
#include <fcntl.h>
#include <sys/stat.h>
int utimensat(int dirfd, const char *pathname, const struct timespec times[2], int flags);

dirfd: 该参数可以是一个目录的文件描述符,也可以是特殊值 AT_FDCWD;如果 pathname 参数指定
的是文件的绝对路径,则此参数会被忽略。
pathname: 指定文件路径。如果 pathname 参数指定的是一个相对路径、并且 dirfd 参数不等于特殊值
AT_FDCWD,则实际操作的文件路径是相对于文件描述符 dirfd 指向的目录进行解析。如果 pathname 参数
指定的是一个相对路径、并且 dirfd 参数等于特殊值 AT_FDCWD, 则实际操作的文件路径是相对于调用进
程的当前工作目录进行解析。
times: 与 futimens()的 times 参数含义相同。
flags : 此 参 数 可 以 为 0 , 也 可 以 设 置 为 AT_SYMLINK_NOFOLLOW , 如 果 设 置 为
AT_SYMLINK_NOFOLLOW,当 pathname 参数指定的文件是符号链接, 则修改的是该符号链接的时间戳,
而不是它所指向的文件。
返回值: 成功返回 0;失败返回-1、并会设置时间戳。

六、符号链接(软连接)与硬链接

使用 ln 命令可以为一个文件创建软链接(快捷方式)文件或硬链接(别名)文件,用法如下:
硬链接: ln 源文件 链接文件
软链接: ln -s 源文件 链接文件

使用"ls -li"命令查看链接数

软链接文件的数据块中存储的是源文件的路径名。当源文件被删除之后,软链接文件依然存在,但此时它指向的是一个无效的文件路径, 这种链接文件被称为悬空链接。


对于硬链接来说, 存在一些限制情况,如下:
⚫ 不能对目录创建硬链接(超级用户可以创建,但必须在底层文件系统支持的情况下)。
⚫ 硬链接通常要求链接文件和源文件位于同一文件系统中。
而软链接文件的使用并没有上述限制条件,优点如下所示:
⚫ 可以对目录创建软链接;
⚫ 可以跨越不同文件系统;
⚫ 可以对不存在的文件创建软链接。
 

1、创建硬链接link()

//系统调用
#include <unistd.h>
int link(const char *oldpath, const char *newpath);


oldpath: 用于指定被链接的源文件路径,应避免 oldpath 参数指定为软链接文件,为软链接文件创建硬
链接没有意义,虽然并不会报错。
newpath: 用于指定硬链接文件路径,如果 newpath 指定的文件路径已存在,则会产生错误。
返回值: 成功返回 0;失败将返回-1,并且会设置 errno。

2、创建软链接symlink()

//系统调用
#include <unistd.h>
int symlink(const char *target, const char *linkpath);

target: 用于指定被链接的源文件路径, target 参数指定的也可以是一个软链接文件。
linkpath: 用于指定硬链接文件路径,如果 newpath 指定的文件路径已存在,则会产生错误。
返回值: 成功返回 0;失败将返回-1,并会设置 errno。

3、读取软链接文件

//系统调用
#include <unistd.h>
ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);

pathname: 需要读取的软链接文件路径。 只能是软链接文件路径,不能是其它类型文件,否则调用函
数将报错。
buf: 用于存放路径信息的缓冲区。
bufsiz: 读取大小,一般读取的大小需要大于链接文件数据块中存储的文件路径信息字节大小。
返回值: 失败将返回-1,并会设置 errno;成功将返回读取到的字节数。

七、目录

1、目录存储形式

  • 普通文件由 inode 节点和数据块构成
  • 目录由 inode 节点和目录块构成
     

2、创建和删除目录

//系统调用
#include <sys/stat.h>
#include <sys/types.h>
int mkdir(const char *pathname, mode_t mode);

pathname: 需要创建的目录路径。
mode: 新建目录的权限设置,设置方式与 open 函数的 mode 参数一样,最终权限为(mode & ~umask)。
返回值: 成功返回 0;失败将返回-1,并会设置 errno。


//系统调用
#include <unistd.h>
int rmdir(const char *pathname);

pathname: 需要删除的目录对应的路径名,并且该目录必须是一个空目录,也就是该目录下只有.和..这
两个目录项; pathname 指定的路径名不能是软链接文件,即使该链接文件指向了一个空目录。
返回值: 成功返回 0;失败将返回-1,并会设置 errno。

3、打开、读取以及关闭目录

//C库函数,打开目录
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);

name: 指定需要打开的目录路径名,可以是绝对路径,也可以是相对路径。
返回值: 成功将返回指向该目录的句柄,一个 DIR 指针(其实质是一个结构体指针),其作用类似于
open函数返回的文件描述符fd,后续对该目录的操作需要使用该DIR指针变量;若调用失败,则返回NULL。


//C库函数,读取目录
#include <dirent.h>
struct dirent *readdir(DIR *dirp);

dirp: 目录句柄 DIR 指针。
返回值: 返回一个指向 struct dirent 结构体的指针, 该结构体表示 dirp 指向的目录流中的下一个目录条目。在到达目录流的末尾或发生错误时,它返回 NULL。


//C库函数,将目录流重置为目录起点
#include <sys/types.h>
#include <dirent.h>
void rewinddir(DIR *dirp);

dirp: 目录句柄。
返回值: 无返回值。


//C库函数,关闭目录
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);

dirp: 目录句柄。
返回值: 成功返回 0;失败将返回-1,并设置 errno。

4、进程的当前工作目录

//系统调用,获取进程的当前工作目录
#include <unistd.h>
char *getcwd(char *buf, size_t size);

buf: getcwd()将内含当前工作目录绝对路径的字符串存放在 buf 缓冲区中。
size: 缓冲区的大小,分配的缓冲区大小必须要大于字符串长度,否则调用将会失败。
返回值: 如果调用成功将返回指向 buf 的指针,失败将返回 NULL,并设置 errno。

若传入的 buf 为 NULL,且 size 为 0,则 getcwd()内部会按需分配一个缓冲区,并将指向该缓冲区
的指针作为函数的返回值,为了避免内存泄漏,调用者使用完之后必须调用 free()来释放这一缓冲区所占内
存空间。



//系统调用,更改进程的当前工作目录
#include <unistd.h>
int chdir(const char *path);
int fchdir(int fd);

path: 将进程的当前工作目录更改为 path 参数指定的目录,可以是绝对路径、也可以是相对路径,指
定的目录必须要存在,否则会报错。
fd: 将进程的当前工作目录更改为 fd 文件描述符所指定的目录(譬如使用 open 函数打开一个目录)。
返回值: 成功均返回 0;失败均返回-1,并设置 errno。

八、删除文件

//系统调用,删除文件
#include <unistd.h>
int unlink(const char *pathname);

pathname: 需要删除的文件路径,可使用相对路径、也可使用绝对路径,如果 pathname 参数指定的文
件不存在,则调用 unlink()失败。
返回值: 成功返回 0;失败将返回-1,并设置 errno。
//C 库函数,移除一个文件或空目录
#include <stdio.h>
int remove(const char *pathname);

pathname: 需要删除的文件或目录路径,可以是相对路径、也可是决定路径。
返回值: 成功返回 0;失败将返回-1,并设置 errno。

九、文件重命名

系统调用,文件重命名、文件移至同一文件系统中的另一个目录下
#include <stdio.h>
int rename(const char *oldpath, const char *newpath);

oldpath: 原文件路径。
newpath: 新文件路径。
返回值: 成功返回 0;失败将返回-1,并设置 errno。

rename()调用仅操作目录条目,而不移动文件数据(不改变文件 inode 编号、不移动文件数据块中存储的内容) ,重命名既不影响指向该文件的其它硬链接,也不影响已经打开该文件的进程(譬如,在重命名之前该文件已被其它进程打开了,而且还未被关闭) 。

根据 oldpath、 newpath 的不同,有以下不同的情况需要进行说明:

  • 若 newpath 参数指定的文件或目录已经存在,则将其覆盖;
  • 若 newpath 和 oldpath 指向同一个文件,则不发生变化(且调用成功)。
  • rename()系统调用对其两个参数中的软链接均不进行解引用。如果 oldpath 是一个软链接,那么将 重命名该软链接;如果 newpath 是一个软链接,则会将其移除、被覆盖。
  • 如果 oldpath 指代文件,而非目录,那么就不能将 newpath 指定为一个目录的路径名。要想重命名 一个文件到某一个目录下, newpath 必须包含新的文件名。
  • 如果 oldpath 指代为一个目录,在这种情况下, newpath 要么不存在,要么必须指定为一个空目录。
  • oldpath 和 newpath 所指代的文件必须位于同一文件系统。
  • 不能对.(当前目录)和..(上一级目录)进行重命名。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日两题 / 79. 单词搜索 39. 组合总和(LeetCode热题100)

79. 单词搜索 - 力扣&#xff08;LeetCode&#xff09; 遍历board&#xff0c;遇到字符等于word的第一个字符时&#xff0c;进行dfs回溯 设置访问数组&#xff0c;标记已经走过的坐标 每次dfs时&#xff0c;往四个方向走&#xff0c;若当前字符不匹配则回溯&#xff0c;记得消…

【深度学习】paddlets,时序数据预测

文章目录 一、环境二、题目1三、题目2四、题目3五、函数参数 资料&#xff1a; https://paddlets.readthedocs.io/zh-cn/latest/source/api/paddlets.models.base.html#paddlets.models.base.BaseModel.recursive_predict https://aistudio.baidu.com/projectdetail/5866171?…

记一次MySQL执行修改语句超时问题

异常问题 原因分析 这个问题发生在开发环境&#xff0c;怀疑是提交事务时终止项目运行&#xff0c;没有提交该事务&#xff0c;造成死锁 调试该事务时时间太长&#xff0c;为什么说有这个原因呢&#xff0c;因为通过查找日志显示 The client was disconnected by the server …

$subcribe的使用

$subcribe的使用 只要是store都有$subscribe函数&#xff0c;是订阅的意思&#xff0c;可以监测到store中数据的变化 使用$subscribe函数可以实现刷新不丢失&#xff0c;将数据保存到浏览器的本地存储中&#xff0c;每次进入页面都使用localStorage的数据填充页面

【credit_based流控机制】

credit_based流控机制 1 credit_based way1.1 Principle1.3 DFD1.4 Module1.4.1 Interface1.4.2 Code Block 在网络芯片处理大流量报文中&#xff0c;一般主要是两种机制&#xff1a;1.valid–ready反压(backpressure)机制&#xff1b;2.credit信用机制&#xff1b; credit机制…

电商API接口(api商品数据)【电商商品实时数据采集API接口】

众多品牌选择电商API实时数据采集接口进行采购&#xff0c;主要是出于以下几个重要原因&#xff1a; 第一&#xff0c;高效便捷。比价工具通过自动化的方式获取价格信息&#xff0c;避免了繁琐的人工操作&#xff0c;大大节省了时间和精力。 第二&#xff0c;精准比较。API比价…

常见的CSS布局

1 左侧固定宽度&#xff0c;右侧自适应宽度的两列布局实现 HTML: <div className"outer"><div className"left">固定宽度</div><div className"right">自适应宽度</div></div> 方法1&#xff1a;左侧div设…

美发店服务预约会员小程序的作用是什么

美发店不同于美容美甲&#xff0c;男女都是必需且年龄层几乎不限&#xff0c;商家在市场拓展时只要方法得当相对比较容易&#xff0c;当今客户适应于线上信息获取、咨询及实际内容开展&#xff0c;商家也需要赋能和提升自身服务效率&#xff0c;合理化管理。 运用【雨科】平台…

C语言基础(六)

C语言基础 指针与一维数组总结 * p、* (p)、&#xff08;\*p&#xff09;、* p、*(p)、*p区别和用法运算优先级p与p区别*p与 *&#xff08;p&#xff09;与&#xff08;*p&#xff09;*p与 *&#xff08;p&#xff09;与 *p 指针常量与一维数组的关系指针变量与一维数组的关系数…

002 仿muduo库实现高性能服务器组件_整体框架

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言项目框架小结 前言 本文不会包含任何项目模块的代码&#xff0c;旨在向你介绍项目具体分为哪几个模块&am…

文档档案管理系统整体建设方案书(实际项目原件word2024)

1.系统概述 1.1.需求描述 1.2.需求分析 1.3.重难点分析 1.4.重难点解决措施 2.系统架构设计 2.1.系统架构图 2.2.关键技术 数据备份技术 3.系统功能设计 3.1.功能清单列表 3.2.基础数据管理 3.3.位置管理 3.4.文档使用 3.5.文档管理 软件全套资料包获取方式①&#xff1a;软件项…

揭秘 淘宝死店采集私信筛选,号称日赚500+

淘宝死店采集工具为电子商务创业者揭示了一个领域的新机遇&#xff0c;通过提供一系列深入分析和资源挖掘的功能&#xff0c;展现了从失败中寻找成功之道的独特方法论。以下是如何通过这种工具寻找电商平台中的隐含机会的几个关键方面&#xff1a; 分析失败的深层原因&#x…

【启程Golang之旅】深入解析函数的奥秘与技巧

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

html5+css3+js学习记录(1)-- html

1 vscode前端插件 1.1 Web标准 2 文档声明与字符编码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpor…

【全开源】海报在线制作系统源码(ThinkPHP+FastAdmin+UniApp)

打造个性化创意海报的利器 引言 在数字化时代&#xff0c;海报作为一种重要的宣传媒介&#xff0c;其设计质量和效率直接影响着宣传效果。为了满足广大用户对于个性化、高效制作海报的需求&#xff0c;海报在线制作系统源码应运而生。本文将详细介绍海报在线制作系统源码的特…

【电子元件】TL431 电压基准

TL431(C23892)是一种常用的可调节精密电压基准和电压调节器。它广泛应用于电源管理、精密参考电压和稳压电路等领域。以下是TL431的一些关键特点和使用方法&#xff1a; 关键特点 可调输出电压&#xff1a;TL431的输出电压可以通过外部电阻网络在2.495V到36V范围内调整。精度高…

【知识图谱】探索攻略:基础、构建、高级应用与相关论文方向

【知识图谱】相关文章汇总 写在最前面一、什么是知识图谱&#xff1f;二、相关历史文章代码实现&#xff1a;简单的知识图谱可视化知识图谱前身&#xff1a;信息抽取知识图谱应用1&#xff1a;社交网络分析知识图谱应用2&#xff1a;威胁情报挖掘知识图谱应用3&#xff1a;Code…

当AWR1843发送完设置的固定帧后,如何使其再发送第一次的帧?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

人类最友好语言? YAML 深入解析:从语法到最佳实践

什么是YAML YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种人类可读的数据序列化语言。它的设计目标是使数据在不同编程语言之间交换和共享变得简单。YAML采用了一种简洁、直观的语法&#xff0c;以易于阅读和编写的方式表示数据结构。 YAML广泛应用于配置文…

Elasticsearch的Index sorting 索引预排序会导致索引数据的移动吗?

索引预排序可以确保索引数据按照指定字段的指定顺序进行存储&#xff0c;这样在查询的时候&#xff0c;如果固定使用这个字段进行排序就可以加快查询效率。 我们知道数据写入的过程中&#xff0c;如果需要确保数据有序&#xff0c;可能需要在原数据的基础上插入新的数据&#…