mirror of
https://github.com/vlang/v.git
synced 2025-09-19 04:17:46 -04:00
parent
61a619937b
commit
59b162c29f
@ -226,7 +226,12 @@ pub fn cp(src string, dst string) ! {
|
|||||||
w_src := src.replace('/', '\\')
|
w_src := src.replace('/', '\\')
|
||||||
w_dst := dst.replace('/', '\\')
|
w_dst := dst.replace('/', '\\')
|
||||||
if C.CopyFile(w_src.to_wide(), w_dst.to_wide(), false) == 0 {
|
if C.CopyFile(w_src.to_wide(), w_dst.to_wide(), false) == 0 {
|
||||||
return error_win32(msg: 'failed to copy ${src} to ${dst}')
|
// we must save error immediately, or it will be overwritten by other API function calls.
|
||||||
|
code := int(C.GetLastError())
|
||||||
|
return error_win32(
|
||||||
|
msg: 'failed to copy ${src} to ${dst}'
|
||||||
|
code: code
|
||||||
|
)
|
||||||
}
|
}
|
||||||
} $else {
|
} $else {
|
||||||
fp_from := C.open(&char(src.str), C.O_RDONLY, 0)
|
fp_from := C.open(&char(src.str), C.O_RDONLY, 0)
|
||||||
@ -480,8 +485,11 @@ pub fn rmdir(path string) ! {
|
|||||||
rc := C.RemoveDirectory(path.to_wide())
|
rc := C.RemoveDirectory(path.to_wide())
|
||||||
if !rc {
|
if !rc {
|
||||||
// https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-removedirectorya - 0 == false, is failure
|
// https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-removedirectorya - 0 == false, is failure
|
||||||
|
// we must save error immediately, or it will be overwritten by other API function calls.
|
||||||
|
code := int(C.GetLastError())
|
||||||
return error_win32(
|
return error_win32(
|
||||||
msg: 'Failed to remove "${path}": ' + get_error_msg(int(C.GetLastError()))
|
msg: 'Failed to remove "${path}"'
|
||||||
|
code: code
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
} $else {
|
} $else {
|
||||||
@ -1077,7 +1085,7 @@ pub fn last_error() IError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Magic constant because zero is used explicitly at times
|
// Magic constant because zero is used explicitly at times
|
||||||
pub const error_code_not_set = int(0x7EFEFEFE)
|
pub const error_code_not_set = int(-1)
|
||||||
|
|
||||||
@[params]
|
@[params]
|
||||||
pub struct SystemError {
|
pub struct SystemError {
|
||||||
@ -1086,7 +1094,7 @@ pub:
|
|||||||
code int = error_code_not_set
|
code int = error_code_not_set
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return a POSIX error:
|
// error_posix returns a POSIX error:
|
||||||
// Code defaults to last error (from C.errno)
|
// Code defaults to last error (from C.errno)
|
||||||
// Message defaults to POSIX error message for the error code
|
// Message defaults to POSIX error message for the error code
|
||||||
@[inline; manualfree]
|
@[inline; manualfree]
|
||||||
@ -1096,15 +1104,33 @@ pub fn error_posix(e SystemError) IError {
|
|||||||
return error_with_code(message, code)
|
return error_with_code(message, code)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return a Win32 API error:
|
// error_win32 returns a Win32 API error:
|
||||||
// Code defaults to last error (calling C.GetLastError())
|
// example:
|
||||||
|
// ```
|
||||||
|
// // save error code immediately, or it will be overwritten by other API
|
||||||
|
// // function calls, even by `str_intp`.
|
||||||
|
// code := int(C.GetLastError())
|
||||||
|
// error_win32(
|
||||||
|
// msg : 'some error'
|
||||||
|
// code : code
|
||||||
|
// )
|
||||||
|
// ```
|
||||||
|
// wrong usage:
|
||||||
|
// ```
|
||||||
|
// error_win32(
|
||||||
|
// msg : 'some error ${path}' // this will overwrite error code
|
||||||
|
// code : int(C.GetLastError())
|
||||||
|
// )
|
||||||
|
// ```
|
||||||
// Message defaults to Win 32 API error message for the error code
|
// Message defaults to Win 32 API error message for the error code
|
||||||
@[inline; manualfree]
|
@[inline; manualfree]
|
||||||
pub fn error_win32(e SystemError) IError {
|
pub fn error_win32(e SystemError) IError {
|
||||||
$if windows {
|
$if windows {
|
||||||
code := if e.code == error_code_not_set { int(C.GetLastError()) } else { e.code }
|
if e.code == error_code_not_set {
|
||||||
message := if e.msg == '' { get_error_msg(code) } else { e.msg }
|
panic('before calling `error_win32`, you must set `e.code` first.')
|
||||||
return error_with_code(message, code)
|
}
|
||||||
|
message := if e.msg == '' { get_error_msg(e.code) } else { e.msg }
|
||||||
|
return error_with_code(message, e.code)
|
||||||
} $else {
|
} $else {
|
||||||
panic('Win32 API not available on this platform.')
|
panic('Win32 API not available on this platform.')
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user