区分大小写的os.Stat

I am writing a linting tool; one of the rules enforces that all linked files have lowercase filenames on disk, ie:

  • some/asset.png == OK
  • another/asset.PNG == Fail

I was hoping to validate this rule with the following code:

f, err := os.Stat("another/asset.png")
actualName := f.Name()

However the retun value of f.Name() always reflects the value passed to os.Stat(), eg: passing os.Stat("foo.BAR") will yield foo.BAR even if the file is named foo.BaR on disk.

Am I just approaching this problem wrong? Is there another way to get the actual, case-sensitive filename on disk for a given filepath?

Thanks.

When you stat a file, the name returned in the info is the one you provided, as neither the stat_t nor Win32FileAttributeData data structures contain a name (in POSIX a file itself doesn't really have a name, it's just an inode named via 1 or more hardlinks) The actual name of the file on disk is stored in the parent directory. You will need to iterate through the directory entries to find the name as it's stored on disk.

You can either open the directory file directly and call File.ReadDir, or use the ioutil.ReadDir convenience function.