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

Golang path/filepath包详解:高效路径操作与实战案例

Golang path/filepath包详解:高效路径操作与实战案例

    • 引言
    • 基础用法
        • Abs 函数
        • Base 函数
        • Clean 函数
        • Dir 函数
        • Ext 函数
        • FromSlash 和 ToSlash 函数
    • 基础用法
      • Abs 函数
      • Base 函数
      • Clean 函数
      • Dir 函数
      • Ext 函数
      • FromSlash 和 ToSlash 函数
    • 路径操作
      • Join 函数
      • Split 函数
      • Rel 函数
      • Match 函数
      • Glob 函数
    • 文件路径遍历
      • Walk 和 WalkDir 函数
      • 遍历目录树的技巧
        • 根据文件扩展名过滤文件
        • 根据文件大小过滤文件
        • 其他自定义过滤条件
    • 路径匹配
      • Match 函数的高级用法
      • 使用正则表达式进行路径匹配
    • 路径过滤
      • 根据文件扩展名过滤文件
      • 根据文件大小过滤文件
      • 其他自定义过滤条件
    • 实际案例
      • 示例1:实现一个简单的文件搜索工具
      • 示例2:实现一个目录同步工具
      • 示例3:实现一个文件分类工具
    • 常见问题与解决方案
      • 常见错误及调试技巧
        • 路径不存在或无效
        • 路径分隔符问题
      • 性能优化建议
    • 总结

在这里插入图片描述

引言

在Go语言的标准库中,path/filepath包是一个非常重要的工具包,它提供了一系列函数用于操作和处理文件路径。在实际开发中,正确和高效地操作文件路径是每个开发者必备的技能。无论是构建文件路径、解析路径中的各个部分,还是遍历目录树,path/filepath包都提供了便捷的方法来完成这些任务。

本文将详细介绍path/filepath包的用法和技巧,通过丰富的代码示例来展示如何在实际开发中使用这些功能。无论你是处理文件路径的基本操作,还是需要更复杂的路径匹配和过滤,本教程都将为你提供全面的指导。

在接下来的章节中,我们将依次介绍path/filepath包的基础用法、路径操作、文件路径遍历、路径匹配、路径过滤,并结合实际案例来展示这些功能的应用场景。希望通过本文的讲解,能够帮助你更好地理解和使用path/filepath包,从而提升你的开发效率。

基础用法

在这一部分,我们将介绍path/filepath包中的一些基础函数,这些函数是处理文件路径时最常用的工具。通过学习这些函数的用法,你将能够轻松地进行路径的构建、解析和转换。

Abs 函数

Abs函数用于将相对路径转换为绝对路径。它的定义如下:

func Abs(path string) (string, error)

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {relativePath := "path/to/file"absolutePath, err := filepath.Abs(relativePath)if err != nil {fmt.Println("Error:", err)}fmt.Println("Absolute Path:", absolutePath)
}

在这个示例中,我们将相对路径"path/to/file"转换为绝对路径。如果路径不存在或无效,Abs函数将返回一个错误。

Base 函数

Base函数返回路径的最后一个元素。如果路径为空字符串,Base返回.。它的定义如下:

func Base(path string) string

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"base := filepath.Base(path)fmt.Println("Base:", base)
}

在这个示例中,Base函数返回路径"/path/to/file.txt"的最后一个元素,即"file.txt"

Clean 函数

Clean函数通过删除冗余的分隔符和引用使路径更规范。它的定义如下:

func Clean(path string) string

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {dirtyPath := "/path//to/../file"cleanPath := filepath.Clean(dirtyPath)fmt.Println("Clean Path:", cleanPath)
}

在这个示例中,Clean函数将路径"/path//to/../file"规范化为"/path/file"

Dir 函数

Dir函数返回路径中除去最后一个元素的部分,即路径的目录部分。如果路径为空字符串,Dir返回.。它的定义如下:

func Dir(path string) string

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"dir := filepath.Dir(path)fmt.Println("Directory:", dir)
}

在这个示例中,Dir函数返回路径"/path/to/file.txt"的目录部分,即"/path/to"

Ext 函数

Ext函数返回路径中文件的扩展名。如果文件没有扩展名,返回空字符串。它的定义如下:

func Ext(path string) string

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"ext := filepath.Ext(path)fmt.Println("Extension:", ext)
}

在这个示例中,Ext函数返回路径"/path/to/file.txt"中文件的扩展名,即.txt

FromSlash 和 ToSlash 函数

FromSlash函数将使用斜杠(/)的路径转换为系统特定的路径分隔符。ToSlash函数则将系统特定的路径分隔符转换为斜杠(/)。它们的定义如下:

func FromSlash(path string) string
func ToSlash(path string) string

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {unixPath := "/path/to/file"windowsPath := filepath.FromSlash(unixPath)fmt.Println("Windows Path:", windowsPath)windowsPath2 := "C:\\path\\to\\file"unixPath2 := filepath.ToSlash(windowsPath2)fmt.Println("Unix Path:", unixPath2)
}

在这个示例中,FromSlash函数将Unix风格的路径"/path/to/file"转换为Windows风格的路径(在Windows系统上运行),ToSlash函数将Windows风格的路径"C:\\path\\to\\file"转换为Unix风格的路径。

基础用法

在这一部分,我们将介绍path/filepath包中的一些基础函数,这些函数是处理文件路径时最常用的工具。通过学习这些函数的用法,你将能够轻松地进行路径的构建、解析和转换。

Abs 函数

Abs函数用于将相对路径转换为绝对路径。它的定义如下:

func Abs(path string) (string, error)

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {relativePath := "path/to/file"absolutePath, err := filepath.Abs(relativePath)if err != nil {fmt.Println("Error:", err)}fmt.Println("Absolute Path:", absolutePath)
}

在这个示例中,我们将相对路径"path/to/file"转换为绝对路径。如果路径不存在或无效,Abs函数将返回一个错误。

Base 函数

Base函数返回路径的最后一个元素。如果路径为空字符串,Base返回.。它的定义如下:

func Base(path string) string

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"base := filepath.Base(path)fmt.Println("Base:", base)
}

在这个示例中,Base函数返回路径"/path/to/file.txt"的最后一个元素,即"file.txt"

Clean 函数

Clean函数通过删除冗余的分隔符和引用使路径更规范。它的定义如下:

func Clean(path string) string

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {dirtyPath := "/path//to/../file"cleanPath := filepath.Clean(dirtyPath)fmt.Println("Clean Path:", cleanPath)
}

在这个示例中,Clean函数将路径"/path//to/../file"规范化为"/path/file"

Dir 函数

Dir函数返回路径中除去最后一个元素的部分,即路径的目录部分。如果路径为空字符串,Dir返回.。它的定义如下:

func Dir(path string) string

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"dir := filepath.Dir(path)fmt.Println("Directory:", dir)
}

在这个示例中,Dir函数返回路径"/path/to/file.txt"的目录部分,即"/path/to"

Ext 函数

Ext函数返回路径中文件的扩展名。如果文件没有扩展名,返回空字符串。它的定义如下:

func Ext(path string) string

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"ext := filepath.Ext(path)fmt.Println("Extension:", ext)
}

在这个示例中,Ext函数返回路径"/path/to/file.txt"中文件的扩展名,即.txt

FromSlash 和 ToSlash 函数

FromSlash函数将使用斜杠(/)的路径转换为系统特定的路径分隔符。ToSlash函数则将系统特定的路径分隔符转换为斜杠(/)。它们的定义如下:

func FromSlash(path string) string
func ToSlash(path string) string

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {unixPath := "/path/to/file"windowsPath := filepath.FromSlash(unixPath)fmt.Println("Windows Path:", windowsPath)windowsPath2 := "C:\\path\\to\\file"unixPath2 := filepath.ToSlash(windowsPath2)fmt.Println("Unix Path:", unixPath2)
}

在这个示例中,FromSlash函数将Unix风格的路径"/path/to/file"转换为Windows风格的路径(在Windows系统上运行),ToSlash函数将Windows风格的路径"C:\\path\\to\\file"转换为Unix风格的路径。

路径操作

在这一部分,我们将介绍如何使用path/filepath包中的函数进行路径的连接、拆分和相对路径计算等操作。

Join 函数

Join函数将任意数量的路径元素连接成一个单一路径,并根据需要添加斜杠。它的定义如下:

func Join(elem ...string) string

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {path1 := "path/to"path2 := "file"fullPath := filepath.Join(path1, path2)fmt.Println("Full Path:", fullPath)
}

在这个示例中,Join函数将路径"path/to""file"连接成一个单一路径"path/to/file"

Split 函数

Split函数将路径拆分为目录和文件名两部分。它的定义如下:

func Split(path string) (dir, file string)

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {path := "/path/to/file.txt"dir, file := filepath.Split(path)fmt.Println("Directory:", dir)fmt.Println("File:", file)
}

在这个示例中,Split函数将路径"/path/to/file.txt"拆分为目录部分"/path/to/"和文件名部分"file.txt"

Rel 函数

Rel函数返回一个相对路径,将base目录作为起点,目标目录作为终点。它的定义如下:

func Rel(basepath, targpath string) (string, error)

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {basepath := "/path/to"targpath := "/path/to/file.txt"relativePath, err := filepath.Rel(basepath, targpath)if err != nil {fmt.Println("Error:", err)}fmt.Println("Relative Path:", relativePath)
}

在这个示例中,Rel函数返回"/path/to"目录和"/path/to/file.txt"文件之间的相对路径,即"file.txt"

Match 函数

Match函数根据指定的模式匹配路径名。它的定义如下:

func Match(pattern, name string) (matched bool, err error)

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {pattern := "*.txt"name := "file.txt"matched, err := filepath.Match(pattern, name)if err != nil {fmt.Println("Error:", err)}fmt.Println("Matched:", matched)
}

在这个示例中,Match函数根据模式"*.txt"匹配路径名"file.txt",返回true表示匹配成功。

Glob 函数

Glob函数返回所有匹配模式的文件名或错误。它的定义如下:

func Glob(pattern string) (matches []string, err error)

示例代码:

package mainimport ("fmt""path/filepath"
)func main() {pattern := "/path/to/*.txt"matches, err := filepath.Glob(pattern)if err != nil {fmt.Println("Error:", err)}fmt.Println("Matches:", matches)
}

在这个示例中,Glob函数返回所有匹配模式"/path/to/*.txt"的文件名。

文件路径遍历

在这一部分,我们将介绍如何使用path/filepath包中的函数遍历文件路径,包括遍历目录树以及处理遍历过程中的一些技巧。

Walk 和 WalkDir 函数

WalkWalkDir函数用于遍历指定目录下的所有文件和子目录。它们的定义如下:

func Walk(root string, walkFn WalkFunc) error
func WalkDir(root string, walkFn WalkDirFunc) error

WalkFunc类型和WalkDirFunc类型的定义如下:

type WalkFunc func(path string, info os.FileInfo, err error) error
type WalkDirFunc func(path string, d fs.DirEntry, err error) error

示例代码:

package mainimport ("fmt""os""path/filepath"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}fmt.Println("Visited:", path)return nil})if err != nil {fmt.Println("Error:", err)}
}

在这个示例中,Walk函数遍历指定目录"/path/to/directory"下的所有文件和子目录,并在遍历过程中打印每个访问的路径。

遍历目录树的技巧

在遍历目录树时,我们可能需要过滤特定类型的文件或目录,或者对每个访问的文件进行特定的操作。以下是一些常见的技巧:

根据文件扩展名过滤文件

我们可以在WalkFunc中添加条件来过滤特定扩展名的文件。例如,只打印扩展名为.txt的文件:

package mainimport ("fmt""os""path/filepath"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if filepath.Ext(path) == ".txt" {fmt.Println("Visited:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}
根据文件大小过滤文件

我们可以在WalkFunc中添加条件来过滤特定大小的文件。例如,只打印大于1MB的文件:

package mainimport ("fmt""os""path/filepath"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if info.Size() > 1*1024*1024 { // 大于1MBfmt.Println("Visited:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}
其他自定义过滤条件

我们可以根据需要添加各种自定义过滤条件,例如根据文件名、创建时间等进行过滤。以下示例根据文件名包含特定字符串进行过滤:

package mainimport ("fmt""os""path/filepath""strings"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if strings.Contains(info.Name(), "example") {fmt.Println("Visited:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}

在这个示例中,Walk函数仅打印文件名包含字符串"example"的文件。

路径匹配

在这一部分,我们将深入探讨路径匹配的高级用法,包括如何使用path/filepath包中的函数进行更复杂的路径匹配。

Match 函数的高级用法

Match函数不仅可以用来进行简单的模式匹配,还可以结合循环和条件语句进行更复杂的路径匹配操作。例如,我们可以匹配多个模式或排除特定模式:

package mainimport ("fmt""path/filepath"
)func main() {patterns := []string{"*.txt", "*.md"}name := "file.txt"matched := falsefor _, pattern := range patterns {match, err := filepath.Match(pattern, name)if err != nil {fmt.Println("Error:", err)return}if match {matched = truebreak}}fmt.Println("Matched:", matched)
}

在这个示例中,我们使用Match函数匹配多个模式"*.txt""*.md",如果路径名"file.txt"匹配任一模式,则返回true

使用正则表达式进行路径匹配

除了使用Match函数,我们还可以使用Go语言的正则表达式库regexp进行更灵活的路径匹配:

package mainimport ("fmt""path/filepath""regexp"
)func main() {pattern := `.*\.txt$`re, err := regexp.Compile(pattern)if err != nil {fmt.Println("Error:", err)return}name := "file.txt"matched := re.MatchString(filepath.Base(name))fmt.Println("Matched:", matched)
}

在这个示例中,我们使用正则表达式模式".*\.txt$"匹配路径名"file.txt",如果匹配成功则返回true

路径过滤

在这一部分,我们将介绍如何根据不同的条件对路径进行过滤,包括文件扩展名、文件大小以及其他自定义条件。

根据文件扩展名过滤文件

我们可以使用filepath.Ext函数来获取文件的扩展名,并根据扩展名进行过滤。例如,过滤出所有扩展名为.txt的文件:

package mainimport ("fmt""os""path/filepath"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if filepath.Ext(path) == ".txt" {fmt.Println("Found .txt file:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}

根据文件大小过滤文件

我们可以使用os.FileInfoSize方法来获取文件的大小,并根据大小进行过滤。例如,过滤出所有大于1MB的文件:

package mainimport ("fmt""os""path/filepath"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if info.Size() > 1*1024*1024 {fmt.Println("Found large file:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}

其他自定义过滤条件

我们可以根据不同的需求添加自定义的过滤条件。例如,根据文件名、修改时间或其他文件属性进行过滤。以下是一个根据文件名中包含特定字符串进行过滤的示例:

package mainimport ("fmt""os""path/filepath""strings"
)func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if strings.Contains(info.Name(), "example") {fmt.Println("Found file:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}

在这个示例中,Walk函数过滤出文件名中包含字符串"example"的文件。

实际案例

在这一部分,我们将通过几个实际案例来展示如何使用path/filepath包中的函数来实现特定的功能。这些案例包括实现一个简单的文件搜索工具、目录同步工具和文件分类工具。

示例1:实现一个简单的文件搜索工具

我们将实现一个简单的文件搜索工具,用户可以通过指定搜索目录和文件名模式来查找文件。

package mainimport ("flag""fmt""os""path/filepath"
)func main() {var searchDir stringvar pattern stringflag.StringVar(&searchDir, "dir", ".", "search directory")flag.StringVar(&pattern, "pattern", "*.txt", "search pattern")flag.Parse()err := filepath.Walk(searchDir, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if matched, err := filepath.Match(pattern, info.Name()); err != nil {return err} else if matched {fmt.Println("Found:", path)}return nil})if err != nil {fmt.Println("Error:", err)}
}

在这个示例中,我们使用flag包来解析命令行参数,用户可以指定搜索目录和文件名模式。然后使用Walk函数遍历指定目录,查找匹配模式的文件。

示例2:实现一个目录同步工具

我们将实现一个简单的目录同步工具,将源目录中的所有文件复制到目标目录。

package mainimport ("fmt""io""os""path/filepath"
)func copyFile(src, dst string) error {inFile, err := os.Open(src)if err != nil {return err}defer inFile.Close()outFile, err := os.Create(dst)if err != nil {return err}defer outFile.Close()_, err = io.Copy(outFile, inFile)if err != nil {return err}return outFile.Sync()
}func main() {srcDir := "/path/to/source"dstDir := "/path/to/destination"err := filepath.Walk(srcDir, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if info.IsDir() {return nil}relPath, err := filepath.Rel(srcDir, path)if err != nil {return err}dstPath := filepath.Join(dstDir, relPath)if err := os.MkdirAll(filepath.Dir(dstPath), os.ModePerm); err != nil {return err}return copyFile(path, dstPath)})if err != nil {fmt.Println("Error:", err)}
}

在这个示例中,我们实现了copyFile函数来复制文件内容。然后使用Walk函数遍历源目录,将每个文件复制到目标目录的相应位置。

示例3:实现一个文件分类工具

我们将实现一个文件分类工具,根据文件扩展名将文件移动到相应的目录。

package mainimport ("fmt""os""path/filepath"
)func moveFile(src, dst string) error {if err := os.MkdirAll(filepath.Dir(dst), os.ModePerm); err != nil {return err}return os.Rename(src, dst)
}func main() {root := "/path/to/directory"err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}if info.IsDir() {return nil}ext := filepath.Ext(info.Name())dstDir := filepath.Join(root, ext[1:]) // 去掉扩展名前的点dstPath := filepath.Join(dstDir, info.Name())if err := moveFile(path, dstPath); err != nil {return err}fmt.Println("Moved:", path, "to", dstPath)return nil})if err != nil {fmt.Println("Error:", err)}
}

在这个示例中,我们实现了moveFile函数来移动文件。然后使用Walk函数遍历目录,将文件根据扩展名移动到相应的子目录中。

常见问题与解决方案

在这一部分,我们将讨论在使用path/filepath包时可能遇到的常见问题,并提供相应的解决方案和调试技巧。

常见错误及调试技巧

路径不存在或无效

在使用AbsRel等函数时,如果路径不存在或无效,可能会导致错误。建议在操作路径之前,使用os.Stat函数检查路径是否存在。

package mainimport ("fmt""os""path/filepath"
)func main() {path := "path/to/file"if _, err := os.Stat(path); os.IsNotExist(err) {fmt.Println("Path does not exist:", path)return}absolutePath, err := filepath.Abs(path)if err != nil {fmt.Println("Error:", err)}fmt.Println("Absolute Path:", absolutePath)
}
路径分隔符问题

在跨平台开发中,不同操作系统的路径分隔符不同,可能导致路径处理问题。建议使用filepath.FromSlashfilepath.ToSlash函数进行路径分隔符的转换。

package mainimport ("fmt""path/filepath"
)func main() {unixPath := "/path/to/file"windowsPath := filepath.FromSlash(unixPath)fmt.Println("Windows Path:", windowsPath)windowsPath2 := "C:\\path\\to\\file"unixPath2 := filepath.ToSlash(windowsPath2)fmt.Println("Unix Path:", unixPath2)
}

性能优化建议

在处理大量文件路径时,可以通过以下方式优化性能:

  1. 批量操作:尽量减少多次I/O操作,可以通过批量处理文件路径来减少I/O次数。
  2. 缓存结果:对于频繁访问的路径,可以将结果缓存起来,避免重复计算。
  3. 并发处理:使用Go语言的并发特性,通过多个goroutine并发处理文件路径,提升处理效率。

示例代码:

package mainimport ("fmt""os""path/filepath""sync"
)func processFile(path string, info os.FileInfo) {fmt.Println("Processing:", path)
}func main() {root := "/path/to/directory"var wg sync.WaitGrouperr := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {if err != nil {return err}wg.Add(1)go func() {defer wg.Done()processFile(path, info)}()return nil})if err != nil {fmt.Println("Error:", err)}wg.Wait()
}

在这个示例中,我们使用goroutine并发处理文件路径,提升了处理效率。

总结

通过本文的介绍,我们详细讲解了Go语言标准库中path/filepath包的用法和技巧。无论是基础的路径操作、复杂的路径匹配与过滤,还是实际案例的实现,我们都通过丰富的代码示例展示了如何在实际开发中高效地使用path/filepath包。

希望通过本文的讲解,能够帮助你更好地理解和使用path/filepath包,从而提升开发效率。如果你想进一步深入学习Go语言的文件路径处理,建议参考官方文档和相关的开源项目,不断实践和积累经验。

相关文章:

Golang path/filepath包详解:高效路径操作与实战案例

Golang path/filepath包详解:高效路径操作与实战案例 引言基础用法Abs 函数Base 函数Clean 函数Dir 函数Ext 函数FromSlash 和 ToSlash 函数 基础用法Abs 函数Base 函数Clean 函数Dir 函数Ext 函数FromSlash 和 ToSlash 函数 路径操作Join 函数Split 函数Rel 函数Ma…...

【Shiro】Shiro 的学习教程(四)之 SpringBoot 集成 Shiro 原理

目录 1、第一阶段:启动服务,构建类的功能2、第二阶段:正式请求 1、第一阶段:启动服务,构建类的功能 查看 Shiro 配置类 ShiroConfiguration: Configuration public class ShiroConfiguration {// 创建 sh…...

多线程篇(阻塞队列- PriorityBlockingQueue)(持续更新迭代)

目录 一、简介 二、类图 三、源码解析 1. 字段讲解 2. 构造方法 3. 入队方法 put 浮调整比较器方法的实现 入队图解 4. 出队方法 take dequeue 下沉调整比较器方法的实现 出队图解 四、总结 一、简介 PriorityBlockingQueue队列是 JDK1.5 的时候出来的一个阻塞…...

strstr函数的使用和模拟实现

目录 1.头文件 2.strstr函数的使用 3.strstr函数模拟实现 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff01;没这个必要&#xff0c;方源面色淡然一把抓住&#xff01;顷刻炼化&#xff01; 1.头文件 strstr函数的使用需要头文件 #include<string.h>…...

使用Selenium与WebDriver实现跨浏览器自动化数据抓取

背景/引言 在数据驱动的时代&#xff0c;网络爬虫成为了收集和分析海量数据的关键工具。为了应对不同浏览器环境下的兼容性问题&#xff0c;Selenium与WebDriver成为了开发者实现跨浏览器自动化数据抓取的首选工具。本文将深入探讨如何利用Selenium和WebDriver实现跨浏览器的数…...

信创实践(3):基于x2openEuler将CentOS升级成openEuler,享受其带来的创新和安全特性

引言&#xff1a; 在当前的 IT 行业中&#xff0c;创新和安全性是两大关键趋势。随着 CentOS 停止维护&#xff0c;许多用户正在寻找替代方案&#xff0c;以保持其系统的更新和安全。openEuler 作为一个强大的开源操作系统&#xff0c;成为了理想的迁移目标。本教程将指导您如…...

LEAN 类型理论之注解(Annotations of LEAN Type Theory)-- 相等类型(Equality Type)

《何谓相等 (Equality)&#xff0c;在类型理论(Type Theory)语境下》 与 《转化&#xff08;conversion and reduction&#xff09;后的相等&#xff08;Equality&#xff09;》&#xff0c;两文中&#xff0c;已对相等&#xff08;Equality&#xff09;的概念进行了描述&#…...

Idea 创建 Maven项目的时候卡死

文章目录 一、Archetype 和 Catalog1.1 Archetype&#xff08;原型&#xff09;1.2 Catalog&#xff08;目录&#xff09; 二、可能遇到的问题2.1 问题描述2.2 原因分析2.3 解决方案 参考资料 一、Archetype 和 Catalog 1.1 Archetype&#xff08;原型&#xff09; Archetype…...

C++入门(02)简单了解C++应用程序的开发部署

文章目录 1. 开发C应用程序2. 简单示例计算器程序3. 需求分析4. 设计5. 编码6. 编译7. 调试8. 测试9. 部署10. 部署示例10.1 使用Visual Studio Installer Projects创建安装程序10.2 安装VisualStudio Installer Projects扩展10.3 在calculator解决方案中创建安装项目10.3.1 添…...

有了室内外一体化人行导航,你还怕迷路吗?

在快节奏的现代生活中&#xff0c;无论是穿梭于繁华的都市丛林&#xff0c;还是漫步于错综复杂的购物中心&#xff0c;迷路似乎成了不少人的“小确丧”。然而&#xff0c;随着科技的飞速发展&#xff0c;一项革命性的创新——室内外一体化人行导航系统&#xff0c;正悄然改变着…...

Python虚拟环境包迁移

1. 激活源虚拟环境 首先&#xff0c;激活你想要导出包的源虚拟环境。在命令行中输入&#xff1a; Windows: path\to\your\source_env\Scripts\activatemacOS/Linux: source path/to/your/source_env/bin/activate 2. 导出已安装包的列表 使用以下命令生成一个requirements…...

利用分布式锁在ASP.NET Core中实现防抖

前言 在 Web 应用开发过程中&#xff0c;防抖&#xff08;Debounce&#xff09; 是确保同一操作在短时间内不会被重复触发的一种有效手段。常见的场景包括防止用户在短时间内重复提交表单&#xff0c;或者避免多次点击按钮导致后台服务执行多次相同的操作。无论在单机环境中&a…...

Django+Vue3前后端分离学习(二)(重写User类)

一、重写User类&#xff1a; 1、首先导入User类&#xff1a; from django.contrib.auth.models import User 2、然后点在User上&#xff0c;按住ctrl 点进去&#xff0c;发现 User类继承AbstractUser Ctrl点进去AbstractUser&#xff0c;然后将此方法全部复制到自己APP的mo…...

兔英语语法体系——观后笔记

目录 一、视频链接 二、视频前言 三、简单句(Simple Sentences) 1. 可独立完成的动作 2. 有1个动作的承受者 3. 有两个动作承受者 4. 只有一个动作承受者(但需补充) 5. 非 “动作” 6. 总结 四、五大基本句型 五、句子成分 6. 定语 7. 状语 8. 同位语 9. 总结 …...

哈希表如何避免冲突

系列文章&#xff1a; 1. 先导片--Map&Set之二叉搜索树 2. Map&Set之相关概念 3. 哈希表如何避免冲突 目录 1.概念 2. 冲突-概念 3. 冲突-避免 3.1 冲突-避免-哈希函数设计 3.2 冲突-避免-负载因子调节 4. 冲突-解决 4.1 冲突-解决-闭散列 4.1.1 线性探…...

内核模块驱动开发

内核模块开始学习前&#xff0c;一定是最先接触到内核模块三要素(面试)&#xff0c;驱动入口、驱动出口和协议的遵循。 1.内核模块三要素(面试)//修饰模块化驱动的入口函数module_init(demo_init);//修饰模块化驱动的出口函数module_eixt(demo_exit);//遵循GPL开源协议MODULE_…...

Linux 下 alsa 库录音并保存为 WAV 格式

麦克风列表&#xff1a; [jnjn build]$ arecord -l **** List of CAPTURE Hardware Devices **** card 0: AudioPCI [Ensoniq AudioPCI], device 0: ES1371/1 [ES1371 DAC2/ADC]Subdevices: 1/1Subdevice #0: subdevice #0 card 1: Camera [2K USB Camera], device 0: USB Aud…...

使用stripe进行在线支付、退款、订阅、取消订阅功能(uniapp+h5)

stripe官网:Stripe 登录 | 登录 Stripe 管理平台 然后在首页当中打开测试模式,使用测试的公钥跟私钥进行开发 测试卡号 4242 4242 4242 4242 1234 567 在线支付 stripe的在线支付有两种,第一种就是无代码,第二中就是使用api进行自定义,一般来说推荐第二种进行开发 无…...

深度学习中常见的损失函数

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 深度学习中常见的损失函数 损失函数的作用 损失函数是衡量神经网络输出与真实标签之间差距的指标。在训练过程中&#xff0c;神经网络的目标是最小化损失函数的值。常见的损失函数包括均方误差&#xff08;MS…...

认识Linux及Linux的环境搭建

目录 1、什么是Linux2、Linux环境搭建2.1 下载安装 Xshell2.2 下载安装 VMware Workstation Pro2.3 选择适合自己系统 1、什么是Linux Linux&#xff0c;一般指GNU/Linux&#xff08;单独的Linux内核并不可直接使用&#xff0c;一般搭配GNU套件&#xff0c;故得此称呼&#xff…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

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 开发者设计的强大库&#xff…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理

在城市的某个角落&#xff0c;一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延&#xff0c;滚滚浓烟弥漫开来&#xff0c;周围群众的生命财产安全受到严重威胁。就在这千钧一发之际&#xff0c;消防救援队伍迅速行动&#xff0c;而豪越科技消防一体化安全管控平台构建的消防“…...

C#中用于控制自定义特性(Attribute)

我们来详细解释一下 [AttributeUsage(AttributeTargets.Class, AllowMultiple false, Inherited false)] 这个 C# 属性。 在 C# 中&#xff0c;Attribute&#xff08;特性&#xff09;是一种用于向程序元素&#xff08;如类、方法、属性等&#xff09;添加元数据的机制。Attr…...

JS的传统写法 vs 简写形式

一、条件判断与逻辑操作 三元运算符简化条件判断 // 传统写法 let result; if (someCondition) {result yes; } else {result no; }// 简写方式 const result someCondition ? yes : no;短路求值 // 传统写法 if (condition) {doSomething(); }// 简写方式 condition &…...