mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-13 17:22:27 +08:00
单独剥离出来一个为windows的,增加RandNumLen为取指定长度随机数.
This commit is contained in:
@@ -40,6 +40,7 @@ import (
|
|||||||
- [RandStringSlice](#RandStringSlice)
|
- [RandStringSlice](#RandStringSlice)
|
||||||
- [RandBool](#RandBool)
|
- [RandBool](#RandBool)
|
||||||
- [RandBoolSlice](#RandBoolSlice)
|
- [RandBoolSlice](#RandBoolSlice)
|
||||||
|
- [RandNumLen](#RandNumLen)
|
||||||
|
|
||||||
|
|
||||||
<div STYLE="page-break-after: always;"></div>
|
<div STYLE="page-break-after: always;"></div>
|
||||||
@@ -522,4 +523,29 @@ func main() {
|
|||||||
result := random.RandBoolSlice(2)
|
result := random.RandBoolSlice(2)
|
||||||
fmt.Println(result) // [true false] (random)
|
fmt.Println(result) // [true false] (random)
|
||||||
}
|
}
|
||||||
|
```
|
||||||
|
### <span id="RandNumLen">RandNumLen</span>
|
||||||
|
|
||||||
|
<p>生成指定长度的随机数</p>
|
||||||
|
|
||||||
|
<b>函数签名:</b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
func RandNumLen(len int) int
|
||||||
|
```
|
||||||
|
|
||||||
|
<b>实例:<span style="float:right;display:inline-block;">[运行](https://go.dev/play/p/o-VSjPjnILI)</span></b>
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/duke-git/lancet/v2/random"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
i := random.RandNumLen(2)
|
||||||
|
fmt.Println(i)
|
||||||
|
}
|
||||||
```
|
```
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
// Copyright 2021 dudaodong@gmail.com. All rights reserved.
|
// Copyright 2021 dudaodong@gmail.com. All rights reserved.
|
||||||
// Use of this source code is governed by MIT license.
|
// Use of this source code is governed by MIT license.
|
||||||
|
|
||||||
@@ -15,7 +18,6 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/duke-git/lancet/v2/validator"
|
"github.com/duke-git/lancet/v2/validator"
|
||||||
"golang.org/x/sys/windows"
|
|
||||||
"io"
|
"io"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -25,7 +27,6 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"unsafe"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// FileReader is a reader supporting offset seeking and reading one
|
// FileReader is a reader supporting offset seeking and reading one
|
||||||
@@ -948,32 +949,3 @@ func ParallelChunkRead(filePath string, linesCh chan<- []string, chunkSizeMB, ma
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetExeDllVersion 获取exe或dll文件的版本信息
|
|
||||||
func GetExeDllVersion(filePath string) (string, error) {
|
|
||||||
// 获取版本信息大小
|
|
||||||
size, err := windows.GetFileVersionInfoSize(filePath, nil)
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("无法获取版本信息大小: %w", err)
|
|
||||||
}
|
|
||||||
// 读取版本信息
|
|
||||||
data := make([]byte, size)
|
|
||||||
err = windows.GetFileVersionInfo(filePath, 0, size, unsafe.Pointer(&data[0]))
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("无法获取版本信息: %w", err)
|
|
||||||
}
|
|
||||||
// 查询版本信息
|
|
||||||
var fixedInfo *windows.VS_FIXEDFILEINFO
|
|
||||||
var fixedInfoLen uint32
|
|
||||||
err = windows.VerQueryValue(unsafe.Pointer(&data[0]), `\`, unsafe.Pointer(&fixedInfo), &fixedInfoLen)
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("无法查询版本信息: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 提取版本号
|
|
||||||
major := fixedInfo.FileVersionMS >> 16
|
|
||||||
minor := fixedInfo.FileVersionMS & 0xFFFF
|
|
||||||
build := fixedInfo.FileVersionLS >> 16
|
|
||||||
revision := fixedInfo.FileVersionLS & 0xFFFF
|
|
||||||
return fmt.Sprintf("%d.%d.%d.%d", major, minor, build, revision), nil
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -619,10 +619,3 @@ func TestChunkRead(t *testing.T) {
|
|||||||
assert.Equal("Jim,21,male", lines[1])
|
assert.Equal("Jim,21,male", lines[1])
|
||||||
|
|
||||||
}
|
}
|
||||||
func TestGetExeDllVersion(t *testing.T) {
|
|
||||||
v, err := GetExeDllVersion(`C:\Program Files\Tencent\WeChat\WeChat.exe`)
|
|
||||||
if err != nil {
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
t.Log(v)
|
|
||||||
}
|
|
||||||
|
|||||||
81
fileutil/file_windows.go
Normal file
81
fileutil/file_windows.go
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
//go:build windows
|
||||||
|
|
||||||
|
package fileutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"syscall"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
// tagVS_FIXEDFILEINFO 参考结构体https://learn.microsoft.com/zh-cn/windows/win32/api/verrsrc/ns-verrsrc-vs_fixedfileinfo
|
||||||
|
type tagVS_FIXEDFILEINFO struct {
|
||||||
|
Signature uint32
|
||||||
|
StructVersion uint32
|
||||||
|
FileVersionMS uint32
|
||||||
|
FileVersionLS uint32
|
||||||
|
ProductVersionMS uint32
|
||||||
|
ProductVersionLS uint32
|
||||||
|
FileFlagsMask uint32
|
||||||
|
FileFlags uint32
|
||||||
|
FileOS uint32
|
||||||
|
FileType uint32
|
||||||
|
FileSubtype uint32
|
||||||
|
FileDateMS uint32
|
||||||
|
FileDateLS uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetExeDllVersion 获取exe或dll文件的版本信息
|
||||||
|
func GetExeDllVersion(filePath string) (string, error) {
|
||||||
|
// 加载系统dll
|
||||||
|
versionDLL := syscall.NewLazyDLL("version.dll")
|
||||||
|
getFileVersionInfoSize := versionDLL.NewProc("GetFileVersionInfoSizeW")
|
||||||
|
getFileVersionInfo := versionDLL.NewProc("GetFileVersionInfoW")
|
||||||
|
verQueryValue := versionDLL.NewProc("VerQueryValueW")
|
||||||
|
|
||||||
|
// 转换路径为UTF-16
|
||||||
|
filePathPtr, err := syscall.UTF16PtrFromString(filePath)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("unable to convert file path to UTF-16: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取version信息大小
|
||||||
|
size, _, err := getFileVersionInfoSize.Call(
|
||||||
|
uintptr(unsafe.Pointer(filePathPtr)),
|
||||||
|
0,
|
||||||
|
)
|
||||||
|
if size == 0 {
|
||||||
|
return "", fmt.Errorf("unable to obtain version information size: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加载version信息
|
||||||
|
data := make([]byte, size)
|
||||||
|
ret, _, err := getFileVersionInfo.Call(uintptr(unsafe.Pointer(filePathPtr)), 0, size, uintptr(unsafe.Pointer(&data[0])))
|
||||||
|
if ret == 0 {
|
||||||
|
return "", fmt.Errorf("unable to obtain version information: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询version信息
|
||||||
|
var fixedInfo *tagVS_FIXEDFILEINFO
|
||||||
|
var fixedInfoLen uint32
|
||||||
|
u16, err := syscall.UTF16PtrFromString(`\`)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("unable to convert file path to UTF-16: %w", err)
|
||||||
|
}
|
||||||
|
ret, _, err = verQueryValue.Call(
|
||||||
|
uintptr(unsafe.Pointer(&data[0])),
|
||||||
|
uintptr(unsafe.Pointer(u16)),
|
||||||
|
uintptr(unsafe.Pointer(&fixedInfo)),
|
||||||
|
uintptr(unsafe.Pointer(&fixedInfoLen)),
|
||||||
|
)
|
||||||
|
if ret == 0 {
|
||||||
|
return "", fmt.Errorf("unable to query version information: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 转换结构体
|
||||||
|
major := fixedInfo.FileVersionMS >> 16
|
||||||
|
minor := fixedInfo.FileVersionMS & 0xFFFF
|
||||||
|
build := fixedInfo.FileVersionLS >> 16
|
||||||
|
revision := fixedInfo.FileVersionLS & 0xFFFF
|
||||||
|
return fmt.Sprintf("%d.%d.%d.%d", major, minor, build, revision), nil
|
||||||
|
}
|
||||||
13
fileutil/file_windows_test.go
Normal file
13
fileutil/file_windows_test.go
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
//go:build windows
|
||||||
|
|
||||||
|
package fileutil
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestGetExeDllVersion(t *testing.T) {
|
||||||
|
v, err := GetExeDllVersion(`C:\Windows\System32\cmd.exe`)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
t.Log(v)
|
||||||
|
}
|
||||||
@@ -327,3 +327,11 @@ func UUIdV4() (string, error) {
|
|||||||
|
|
||||||
return fmt.Sprintf("%x-%x-%x-%x-%x", uuid[0:4], uuid[4:6], uuid[6:8], uuid[8:10], uuid[10:]), nil
|
return fmt.Sprintf("%x-%x-%x-%x-%x", uuid[0:4], uuid[4:6], uuid[6:8], uuid[8:10], uuid[10:]), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RandNumLen 生成一个长度为len的随机数
|
||||||
|
func RandNumLen(len int) int {
|
||||||
|
m := int(math.Pow10(len) - 1)
|
||||||
|
i := int(math.Pow10(len - 1))
|
||||||
|
ret := rand.Intn(m-i+1) + i
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user