当前位置: 首页 > 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…...

Java之线程篇三

​​​​​​​ 目录 线程状态 观察线程的所有状态 线程状态及其描述 线程状态转换 代码示例1 代码示例2 线程安全 概念 线程不安全的代码示例 线程不安全的原因 线程安全的代码示例-加锁 synchronized关键字 synchronized的特性 小结 形成死锁的四个必要条件 …...

Bootstrap动态设置表格title项

页面searchType <form id"formId"><div class"select-list"><ul><li><select name"searchType" id"searchType"><option value"1">按各节点统计</option><option value"…...

Arrays.sort()方法在Java中的使用:理论与实践

目录 一.概述 二.实现方式 三.具体介绍 1.基本数据类型数组 2.对象数组 1)使对象实现Comparable接口 2)为对象再专门实现一个比较器类 四.进阶技巧 1.基础类型数组实现自定义比较 2.如何进行逆序排序 3.lambda表达式实现比较器类 4.List的排序方法Collection.sort()…...

用AI写论文,千万不要这样用ChatGPT生成参考文献References!!

ChatGPT作为一种先进的语言大模型&#xff0c;被广泛用于生成文本&#xff0c;虽然用ChatGPT辅助论文写作已是大势所趋&#xff0c;但是&#xff0c;用于生成参考文献References的部分还是要谨慎对待。 在学术写作中&#xff0c;参考文献References扮演着至关重要的角色&#…...

Debian 12如何关闭防火墙

在Debian 12中&#xff0c;默认的防火墙管理工具是ufw&#xff08;Uncomplicated Firewall&#xff09;。您可以使用以下命令来关闭防火墙&#xff1a; 关闭防火墙&#xff1a; sudo ufw disable查看防火墙状态&#xff1a; sudo ufw status如果需要重新开启防火墙&#xff1a;…...

windows C++-并行编程-PPL任务并行(二)

延续任务 在异步编程中&#xff0c;一个异步操作在完成时调用另一个操作并将数据传递到其中的情况非常常见。 传统上&#xff0c;这使用回调方法来完成。 在并发运行时中&#xff0c;延续任务提供了同样的功能。 延续任务(也简称为“延续”)是一个异步任务&#xff0c;由另一个…...

快速了解 servlet(SpringMVC 的底层)

Servlet 是 Java EE&#xff08;现 Jakarta EE&#xff09;中用于处理 Web 请求的核心组件。它在 Web 应用程序的服务器端运行&#xff0c;负责接收和处理客户端&#xff08;如浏览器&#xff09;的请求&#xff0c;并生成响应。 尽管现代Web开发更多采用SpringMVC等框架&…...

QT中tr的作用是什么

在Qt框架中&#xff0c;tr() 函数是一个非常重要的宏&#xff0c;它用于国际化和本地化&#xff08;i18n和l10n&#xff09;支持。tr() 函数使得Qt应用程序能够根据不同的语言环境&#xff08;locale&#xff09;显示相应的翻译文本&#xff0c;从而支持多种语言。 具体来说&a…...

OpenCV结构分析与形状描述符(7)计算轮廓的面积的函数contourArea()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算轮廓的面积。 该函数计算轮廓的面积。与 moments 类似&#xff0c;面积是使用格林公式计算的。因此&#xff0c;返回的面积与你使用 drawCo…...

内网环境使用Docker部署Qwen2模型-vLLM篇

在此之前&#xff0c;我们已成功利用Docker与Ollama框架&#xff0c;在内网环境中部署了Qwen2模型。下面我们再来看一下使用Docker与vLLM框架部署Qwen2模型。 准备vLLM镜像 在一台具备网络环境的机器上执行以下命令&#xff0c;拉取vLLM的镜像&#xff1a; # 官方镜像 docke…...