Golang生成exe后读取目录出现明显差异的原因是什么

Golang生成exe后读取目录出现明显差异的原因是什么 首先贴上我的代码:

funcdealWebdir(confreadfile.Config,pathstring,webfile[]readfile.Ruledata,webfile_white[]readfile.Ruledata) {
    files, _ := ioutil.ReadDir(path)
    skip_slice := strings.Split(conf.Webfile_skip,"|")	
    var stat int = 0
   for _, file := range files {
    fmt.Println(file.Name())
       if file.IsDir() {
     	fmt.Println(file.Name())
        dealWebdir(conf,path+"/" + file.Name(),webfile,webfile_white)
    } else {
        //对文件进行处理
        //fmt.Println(myfolder + "/" + file.Name(),"mode:",file.Mode(),"size:",file.Size(),"modetime:",file.ModTime)
		for _,value := range skip_slice{
			if strings.HasSuffix(strings.ToUpper(file.Name()), strings.ToUpper(value)){
				stat = 1
			}
		}
		if stat == 0{
			dealWebfile(conf,file,path,webfile,webfile_white)
		}else{
			//fmt.Println("path:",path,"skip--",file.Name())
			stat = 0
		}
	}
}

}

参数可以忽略,只要关心path就可以。现在的问题是这样的,当我生成exe文件后,把exe放到f:/目录里面,当我path是F:的时候只能读到exe所在的目录。我读D盘没有问题。C盘,也会出现异常。恳请大神能够指点一下。


更多关于Golang生成exe后读取目录出现明显差异的原因是什么的实战教程也可以访问 https://www.itying.com/category-94-b0.html

15 回复

错误是 nil

更多关于Golang生成exe后读取目录出现明显差异的原因是什么的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于别的磁盘是正常遍历目录的。

那么请告诉我们你实际看到的错误是什么。

但关于F盘我最想知道的是,它直接读取到EXE文件所在的目录,而不是整体遍历F盘目录。

你不是说过F:无论如何都能正常工作吗?当你尝试读取C:D:的内容时看到了什么?

我不理解。如果你尝试使用 C:\ 作为路径会发生什么?

// 代码示例保留原样

不要忽略错误。检查来自 ioutil.ReadDir 的错误并查看具体内容。请告诉我们错误信息。

// 代码示例保留原样

image

错误是nil

image

是不是权限的问题

不要忽略错误。检查 ioutil.ReadDir 返回的错误并查看具体内容。如果您的路径是相对路径,可执行文件的位置或运行方式可能会产生影响。如果错误信息不够明确,我们或许可以提供帮助。

func main() {
    fmt.Println("hello world")
}

我不确定应用程序数据文件夹的情况,但Windows安装的许多默认文件夹都受到严格限制。尝试一个你认为即使是访客账户也应该能够读取的文件夹。

编辑

另外,请复制并粘贴输出内容,而不是截图。由于本月很早就达到了配额,我的移动数据套餐受限,在手机上查看截图非常困难。

当我将Go生成的exe文件放在F盘的某个目录下时,如果输入路径为F:,读取的目录会直接默认定位到exe所在目录。而当我输入F盘下某个具体目录路径时,得到的结果是正常的。以上情况均未出现报错。我认为这可能是环境变量造成的影响。

当我将Go生成的exe文件放在F盘的某个目录下时,如果输入的路径是F:,读取的目录会直接默认定位到exe所在的目录。如果输入的路径是F盘下的某个具体目录,得到的结果就是正常的。以上情况均未出现报错。我认为可能是环境变量产生了影响。

您好,首先很抱歉我的英文不是很好。我再详细的阐述一下具体的情况:

C:------XXX
-----XXX

D:-----XXXX
-----XXXXX

F:----JOS-----
----bin—operator.exe
----xxx

以上是我大体的目录结构,当我运行exe文件时,如果传入的路径是F:那么会出现结果读到的直接是exe文件。若果是f:/xxx则可以正常访问xxx目录。c:会涉及到文件权限,则出现一些问题。D:可以正常使用。

请问,是不是环境变量的问题,导致读取F盘的时候,异常。

期待您的回复

在Windows系统中,Golang程序生成的可执行文件(exe)在访问不同驱动器时出现目录读取差异,通常是由于路径格式和权限问题导致的。以下是具体原因和解决方案:

主要问题分析

1. 路径分隔符问题

Windows系统使用反斜杠\作为路径分隔符,而你的代码中使用正斜杠/。虽然在Go中正斜杠通常也能工作,但在某些情况下可能导致问题。

2. 权限限制

Windows系统对C盘等系统目录有严格的权限控制,普通程序可能无法正常访问。

3. 相对路径与绝对路径

使用相对路径时,程序的工作目录可能影响文件访问结果。

解决方案

使用正确的路径处理方式

package main

import (
    "fmt"
    "io/ioutil"
    "os"
    "path/filepath"
    "strings"
)

func dealWebdir(path string) {
    // 规范化路径,确保使用正确的分隔符
    normalizedPath := filepath.Clean(path)
    
    files, err := ioutil.ReadDir(normalizedPath)
    if err != nil {
        fmt.Printf("读取目录 %s 失败: %v\n", normalizedPath, err)
        return
    }
    
    for _, file := range files {
        fmt.Println(file.Name())
        
        if file.IsDir() {
            // 使用filepath.Join来构建路径
            subPath := filepath.Join(normalizedPath, file.Name())
            dealWebdir(subPath)
        } else {
            // 处理文件
            filePath := filepath.Join(normalizedPath, file.Name())
            fmt.Printf("处理文件: %s\n", filePath)
        }
    }
}

// 更好的实现方式,使用filepath.Walk
func walkDirectory(root string) error {
    err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
        if err != nil {
            fmt.Printf("访问路径 %s 失败: %v\n", path, err)
            return nil // 继续遍历其他文件
        }
        
        if info.IsDir() {
            fmt.Printf("目录: %s\n", path)
        } else {
            fmt.Printf("文件: %s\n", path)
        }
        return nil
    })
    return err
}

func main() {
    // 测试不同驱动器
    drives := []string{"F:\\", "D:\\", "C:\\"}
    
    for _, drive := range drives {
        fmt.Printf("=== 扫描驱动器 %s ===\n", drive)
        
        // 方法1: 使用自定义递归函数
        dealWebdir(drive)
        
        // 方法2: 使用filepath.Walk (推荐)
        // err := walkDirectory(drive)
        // if err != nil {
        //     fmt.Printf("遍历 %s 失败: %v\n", drive, err)
        // }
    }
}

处理权限问题

func checkAndReadDir(path string) {
    // 检查路径是否存在
    if _, err := os.Stat(path); os.IsNotExist(err) {
        fmt.Printf("路径 %s 不存在\n", path)
        return
    }
    
    // 尝试以管理员权限运行程序来访问受限目录
    files, err := ioutil.ReadDir(path)
    if err != nil {
        fmt.Printf("权限不足或路径无效: %s, 错误: %v\n", path, err)
        return
    }
    
    fmt.Printf("成功读取 %s 中的 %d 个条目\n", path, len(files))
}

获取所有可用驱动器

import "syscall"

func getDrives() []string {
    var drives []string
    for _, drive := range "ABCDEFGHIJKLMNOPQRSTUVWXYZ" {
        path := string(drive) + ":\\"
        if _, err := os.Stat(path); err == nil {
            drives = append(drives, path)
        }
    }
    return drives
}

关键改进点

  1. **使用filepath.Join()**代替字符串拼接来构建路径
  2. **使用filepath.Clean()**规范化路径
  3. 添加错误处理来诊断具体问题
  4. **考虑使用filepath.Walk()**作为更可靠的目录遍历方案

这些修改应该能解决你在不同驱动器间读取目录时的差异问题。

回到顶部