//go:build windows

package yu_file

import (
	yu_fast "gogs.qqck.cn/s/tools/fast"
	yu_sys "gogs.qqck.cn/s/tools/sys"
)

// Get
//
//	@Description: 独占方式(多线程安全)读文件
//	@param name 文件路径
func Get(name string) (result []byte) {
	j_fd := Openfile(name, yu_sys.GENERIC_READ, yu_sys.FILE_SHARE_NO, yu_sys.OPEN_EXISTING, 0)
	if j_fd == 0 {
		return
	}
	defer yu_sys.CloseHandle.Call(j_fd)
	j_size, j_ok := getFileSizeEx(j_fd)
	if !j_ok {
		return
	}
	if j_size == 0 {
		return
	}
	return readFileSize(j_fd, int(j_size))
}

// GetS
//
//	@Description: 独占方式(多线程安全)读文件
//	@param name 文件路径
func GetS(name string) string {
	return string(Get(name))
}

// Set
//
//	@Description: 独占方式(多线程安全)写文件
//	@param name 文件路径
//	@param bufs 写出内容...
func Set(name string, bufs ...[]byte) bool {
	j_fd := Openfile(name, yu_sys.GENERIC_WRITE, yu_sys.FILE_SHARE_NO, yu_sys.CREATE_ALWAYS, yu_sys.FILE_FLAG_WRITE_THROUGH)
	if j_fd == 0 {
		return false
	}
	defer yu_sys.CloseHandle.Call(j_fd)
	for j_i := 0; j_i < len(bufs); j_i++ {
		if !writeFile(j_fd, bufs[j_i]) {
			return false
		}
	}
	return true
}

// SetS
//
//	@Description: 独占方式(多线程安全)写文件
//	@param name 文件路径
//	@param bufs 写出内容...
func SetS(name string, bufs ...string) bool {
	j_fd := Openfile(name, yu_sys.GENERIC_WRITE, yu_sys.FILE_SHARE_NO, yu_sys.CREATE_ALWAYS, yu_sys.FILE_FLAG_WRITE_THROUGH)
	if j_fd == 0 {
		return false
	}
	defer yu_sys.CloseHandle.Call(j_fd)
	for j_i := 0; j_i < len(bufs); j_i++ {
		if !writeFile(j_fd, yu_fast.S2B(bufs[j_i])) {
			return false
		}
	}
	return true
}

// Put
//
//	@Description: 独占方式(多线程安全)追加文件数据
//	@param name 文件路径
//	@param bufs 写出内容...
func Put(name string, bufs ...[]byte) bool {
	j_fd := Openfile(name, yu_sys.FILE_APPEND_DATA, yu_sys.FILE_SHARE_NO, yu_sys.OPEN_ALWAYS, yu_sys.FILE_FLAG_WRITE_THROUGH)
	if j_fd == 0 {
		return false
	}
	defer yu_sys.CloseHandle.Call(j_fd)
	for j_i := 0; j_i < len(bufs); j_i++ {
		if !writeFile(j_fd, bufs[j_i]) {
			return false
		}
	}
	return true
}

// PutS
//
//	@Description: 独占方式(多线程安全)追加文件数据
//	@param name 文件路径
//	@param bufs 写出内容...
func PutS(name string, bufs ...string) bool {
	j_fd := Openfile(name, yu_sys.FILE_APPEND_DATA, yu_sys.FILE_SHARE_NO, yu_sys.OPEN_ALWAYS, yu_sys.FILE_FLAG_WRITE_THROUGH)
	if j_fd == 0 {
		return false
	}
	defer yu_sys.CloseHandle.Call(j_fd)
	for j_i := 0; j_i < len(bufs); j_i++ {
		if !writeFile(j_fd, yu_fast.S2B(bufs[j_i])) {
			return false
		}
	}
	return true
}
