Go: рдкреНрд░рд╕реНрддрд╛рд╡: рдУрдПрд╕: рдмрдирд╛рдПрдВ/рдЦреЛрд▓реЗрдВ/рдУрдкрдирдлрд╛рдЗрд▓() рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ FILE_SHARE_DELETE рд╕реЗрдЯ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 16 рдордИ 2019  ┬╖  194рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: golang/go

Linux рдФрд░ MacOS рдкрд░ рд╣рдо рдЗрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ; рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдпрд╣ "рд╕рд╛рдЭрд╛рдХрд░рдг рдЙрд▓реНрд▓рдВрдШрди" рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ:

path := "delete-after-open"
fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0600)
if err != nil { ... }
err = os.Remove(path)            // or os.Rename(path, path+"2")
if err != nil { ... }
fd.Close()

рдпрджрд┐ рдЖрдк рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдЖрджрд┐ рдкрд░ рддреИрдирд╛рдд рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХрд╛ рдХреЛрдб os.Rename() & .Remove() рдХреЗ рдЗрд╕ _undocumented_ GOOS=windows рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдХрдордЬреЛрд░ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреИрдХреЗрдЬ "рдУрдПрд╕" рдореЗрдВ рдЕрдиреНрдп рд╡рд┐рдВрдбреЛрдЬрд╝-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ _рдкрдВрджреНрд░рд╣ рдЙрд▓реНрд▓реЗрдЦ_ рд╣реИрдВред

рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, syscall.Open() https://golang.org/src/syscall/syscall_windows.go#L272 рдкрд░
sharemode |= FILE_SHARE_DELETE

Microsoft рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рдП: https://github.com/golang/go/issues/32088#issuecomment -502850674
рдЬрдВрдЧ рдиреЗ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛ рджрд┐рдпрд╛: https://doc.rust-lang.org/std/os/windows/fs/trait.OpenOptionsExt.html
Mingw-w64 рдиреЗ рдЗрд╕реЗ рд╕рд╛рдд рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛ рджрд┐рдпрд╛ рдерд╛:
https://sourceforge.net/p/mingw-w64/code/HEAD/tree/stable/v3.x/mingw-w64-headers/include/ntdef.h#l858
Erlang рдиреЗ рдЗрд╕реЗ рдЫрд╣ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛ рджрд┐рдпрд╛ рдерд╛: erlang/ otp@0e02f48
MSVC рд░рдирдЯрд╛рдЗрдо рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдкрд╛рдпрдерди рдЗрд╕реЗ рдЕрдкрдирд╛ рдирд╣реАрдВ рд╕рдХрд╛: https://bugs.python.org/issue15244

~рдЗрд╕рд▓рд┐рдП syscall.Open() рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ file_share_delete рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ syscall рдХреЛ рджреЛрдиреЛрдВ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
рдП) рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕реНрд╡рд┐рдЪ (рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рдРрдк рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрд╕рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ), рдФрд░
рдмреА) рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓ рдкрд░ рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП os.OpenFile() рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬред ~

https://github.com/golang/go/issues/32088#issuecomment-532784947 рдХреЗ рдмрд╛рдж @rsc рджреНрд╡рд╛рд░рд╛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:
a) os.Create/Open/OpenFile() рдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╣рдореЗрд╢рд╛ file_share_delete рдХреЛ
рдмреА) рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ syscall.Open() рдХреЛ рдПрдХ рдзреНрд╡рдЬ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ file_share_delete рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░
рд╕реА) рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╕рд┐рд╕реНрдХрд▓ рдХреЛ рдирдП рдзреНрд╡рдЬ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

os.Remove() рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдПрдХ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: os.Rename(path, unique_path); os.Remove(unique_path) ред

рд╡рд┐рди рдПрдкреАрдЖрдИ рдбреЙрдХреНрд╕
https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-deletefilea
https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea

рдпрджрд┐ рдРрд╕рд╛ рди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рд╣реИ, рддреЛ рдЗрд╕реЗ os.Remove() & .Rename() рдореЗрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

cc @alexbrainman
@gopherbot OS-Windows рдЬреЛрдбрд╝реЗрдВ

FrozenDueToAge OS-Windows Proposal Proposal-FinalCommentPeriod release-blocker

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВ рдпрд╣рд╛рдВ рд╡рд┐рдВрдбреЛрдЬ рдЯреАрдо рдХреЗ рдирдЬрд░рд┐рдП рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛... рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрд╢рд╛ FILE_SHARE_DELETE рд╕реЗрдЯ рдХрд░реЗрдВ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рдХрд▓реНрдк рдХреЗред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ/рд╕реЗ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓рд┐рдирдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕реБрд╕рдВрдЧрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВрдЧреЗ, рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ !FILE_SHARE_DELETE рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдо рдХреЗ рдЕрдкрд╡рд╛рдж рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХреНрдпреЛрдВ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред

рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдиреЛрдЯ, @mattn рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╡рд┐рдкрд░реАрдд: рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдордиреЗ "POSIX" рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DeleteFile (NTFS рдкрд░) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдлрд╛рдЗрд▓ рдХреЛ рд╕рднреА рдУрдкрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдиреЗрдорд╕реНрдкреЗрд╕ рд╕реЗ рддреБрд░рдВрдд рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓ред рдпрд╣ рдЕрднреА рднреА FILE_SHARE_DELETE рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдЕрдиреНрдпрдерд╛ POSIX рдЕрдирд▓рд┐рдВрдХ рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ WSL тАЛтАЛрдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝реА рдЧрдИ рдереА рдФрд░ рдЗрд╕реЗ Windows рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдорд╛рдирд╛ рдЧрдпрд╛ рдерд╛ред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдЖрдк рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдореИрдЯрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рдбреЗрд▓, рдбреАрдЖрдИрдЖрд░, рдЖрджрд┐ рдХрд╛ рдЕрдиреБрдХреНрд░рдо рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдирд╛рдорд╕реНрдерд╛рди рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдЧрд╛рдпрдм рд╣реЛрддреЗ рджреЗрдЦреЗрдВрдЧреЗ, рди рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдмрд╛рджред рдмрд┐рд▓реНрдХреБрд▓ рд▓рд┐рдирдХреНрд╕ рдХреА рддрд░рд╣ред

рдЗрд╕рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рд╣реА, рдЗрд╕рдХреЗ рдХрд╛рдлреА рдмрдбрд╝реЗ рдПрдкрдХреЙрдореНрдкреИрдЯ рдЬреЛрдЦрд┐рдо рдХреЗ рд╕рд╛рде, рд╣рдо рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рдЧреИрд░-рд╡рд┐рдВрдбреЛрдЬ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреЛ рдХреЛ рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред

рд╕рднреА 194 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

/рд╕реАрд╕реА @рдПрд▓реЗрдХреНрд╕рдмреНрд░реЗрдирдореИрди

syscall.Open() https://golang.org/src/syscall/syscall_windows.go#L272 рдкрд░
sharemode := ... | FILE_SHARE_DELETE рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдпрд╣ рдХреНрдпреЛрдВ рдЪрд╛рд╣рд┐рдП?

рдПрд▓реЗрдХреНрд╕

FILE_SHARE_DELETE рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдореИрдХреЛрдЬрд╝ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0600)
defer fd.Close()
_, err = fd.Write(...)
err = fd.Sync()  // file now safe to share
err = os.Rename(path, path+"2")
_, err = fd.Read(...)

FILE_SHARE_DELETE рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдореИрдХреЛрдЬрд╝ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп MacOS рдФрд░ Linux рдХреЛрдб рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ?

рдЗрд╕рдХреЗ рд▓рд┐рдП рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣ рд░рд╣реЗ рд╣реИрдВред

рдПрд▓реЗрдХреНрд╕

@networkimprov рдЖрдкрдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдмрдВрдж() рдХреЗ рдмрд╛рдж рдирд┐рдХрд╛рд▓реЗрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

path := "delete-after-open"
fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0600)
if err != nil { panic(err) }
fd.Close()
err = os.Remove(path)            // or os.Rename(path, path+"2")
if err != nil { panic(err) }

@alexbrainman рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдлрд╝рд╛рдЗрд▓ I/O (рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП) рдХрд░рддреЗ рд╕рдордп, рдЕрд╕реНрдерд╛рдпреА рдирд╛рдо рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛, рдЙрд╕реЗ рд▓рд┐рдЦрдирд╛, fsync рдХрд░рдирд╛ рдФрд░ рдЙрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдорд╛рдирдХ рдЕрднреНрдпрд╛рд╕ рд╣реИред

рдпреВрдирд┐рдХреНрд╕ рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЦреБрд▓реА рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рд╛ рдпрд╛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдирд┐рд░реАрдХреНрд╖рдг рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬ рдлреНрд▓реИрдЧ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЧреЛ рдЯреАрдо рдХреЛ рд▓рд┐рдирдХреНрд╕ рдФрд░ рдореИрдХреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛ рд▓реЗрдВрдЧреЗ :-)

@mattn рдХреГрдкрдпрд╛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдлрд┐рдХреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдЖрдЬрдорд╛рдПрдВред

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЧреЛ рдЯреАрдо рдХреЛ рд▓рд┐рдирдХреНрд╕ рдФрд░ рдореИрдХреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛ рд▓реЗрдВрдЧреЗ :-)

рдЕрдм рдЬреИрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ, рдореИрдВ рдареАрдХ рд╣реВрдВред

рдПрд▓реЗрдХреНрд╕

рдХреНрдпрд╛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рдЗрд╕ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╖рдорддрд╛ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдФрдЪрд┐рддреНрдп рд╣реИ?

рдХреНрдпрд╛ рдЖрдк syscall_windows.go рдореЗрдВ рдПрдХ рд╕реНрд╡рд┐рдЪ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдпреВрдирд┐рдХреНрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХреЗрдВ?

рдореИрдВ рдареАрдХ рд╣реВрдВ рдХрд┐ рд╣рдо рдирдП рдПрдкреАрдЖрдИ рдпрд╛ рдЭрдВрдбреЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рдЖрдкрддреНрддрд┐ рд╣реИред рдЪреВрдВрдХрд┐ FILE_SHARE_DELETE рдпреВрдирд┐рдХреНрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред

#include <windows.h>
#include <stdio.h>

int
main(int argc, char* argv[]) {
  HANDLE h = CreateFile("test.txt",
      GENERIC_READ | GENERIC_WRITE,
      FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
      NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  getchar();
  char buf[256] = {0};
  DWORD nread;
  printf("%d\n", ReadFile(h, buf, 256, &nread, NULL));
  printf("%s,%d\n", buf, nread);
  return 0;
}

рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЗрд╕ рдХреЛрдб рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВ, рдФрд░ test.exe рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЬрдмрдХрд┐ рдпрд╣ рдРрдк рд╣рд┐рдЯ-рдП-рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдирдпрд╛ cmd.exe рдЦреЛрд▓реЗрдВ, "test.txt" рдХреЛ рдирд┐рдореНрди рдХреА рддрд░рд╣ рд╣рдЯрд╛рдПрдВред

image

рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдореМрдЬреВрдж рд░рд╣рдиреЗ рдХреЗ рджреМрд░рд╛рди рд╡рд╣реАрдВ рд░рд╣ рдЬрд╛рддреА рд╣реИред рддреЛ рдпрд╣ рдмрджрд▓рд╛рд╡ рдЖрдкрдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реИ рдХрд┐ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╣рддреЗ рд╣реИрдВ:

рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП CreateFile рдХреЗ рдмрд╛рдж рдХреЗ рдХреЙрд▓ ERROR_ACCESS_DENIED рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХрд╛ рд╕реНрдХреНрд░реАрди рд▓реЙрдЧ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред

рд╡реИрд╕реЗ рднреА, рдЗрд╕ рддрд░рд╣ рдПрдХ рд╕реНрд╡рд┐рдЪ рдареАрдХ рд░рд╣реЗрдЧрд╛:

syscall.OpenFileShareDelete = true

рдореИрдВ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рдо рдкрд░ рдХрд╛рдЯ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореВрд▓ рд░реВрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдерд╛:

f, err := os.Open(...)
if err != nil { ... }
defer f.Close()

// lots of code

if err := os.Rename(...); err != nil { ... }

рд╣рдорд╛рд░реЗ рдпреВрдирд┐рдХреНрд╕-рдЖрдзрд╛рд░рд┐рдд рд╕реАрдЖрдИ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдХреЛрдб рдареАрдХ рдЪрд▓рд╛, рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╡рд┐рд╕реНрдлреЛрдЯ рд╣реЛ рдЧрдпрд╛ред

рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдХреЛрдИ рдЕрдЬреАрдм рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИрдВ, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЪреАрдЬреЗрдВ рдЕрднреА рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ ред

IIRC, рд╣рдордиреЗ рдпреВрдирд┐рдХреНрд╕ рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рдХрдЯрддрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддреАрдд рдореЗрдВ GOOS=windows & plan9 рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреБрдЫ рд╕рдорд╛рдпреЛрдЬрди рдХрд┐рдП рд╣реИрдВред рдЕрдЧрд░ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛рдлреА рдХрд░реАрдм рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдРрд╕рд╛ рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛ рдмрдирд╛рдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рдХреНрдХрдд рдирд╣реАрдВ рд╣реЛрдЧреАред @mattn рдХреА рдЯрд┐рдкреНрдкрдгреА, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реБрдЭрд╛рд╡ рджреЗрддреА рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рдХрд░реАрдм рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдХреБрдЫ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдбрд┐рдмрдЧрд┐рдВрдЧ рджреБрдГрд╕реНрд╡рдкреНрди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

@bradfitz
рдпрд╣ рд╢рд╛рдпрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреГрдкрдпрд╛ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдпрд╣рд╛рдБ рджреЗрдЦреЗрдВ
https://groups.google.com/forum/#!topic/golang -dev/R79TJAzsBfM
рдпрд╛ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдореИрдВ рдпрд╣рд╛рдВ рд╕рд╛рдордЧреНрд░реА рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рднреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдмрд▓реНрдХрд┐ рдПрдХ рд╕рдорд╛рди рдХреНрд░реЙрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реЛрдЧрд╛ред -рдУрд╕ рдЕрдиреБрднрд╡ред

@guybrand рдЧреЛрд▓рд╛рдВрдЧ-рджреЗрд╡ рд╕реВрддреНрд░ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

рдореЗрд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо "my.data" рдирд╛рдордХ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рджреВрд╕рд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ... рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 10 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ (рдЗрд╕ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ "рдЕрдкрд▓реЛрдбрд░" рдХрд╣рддреЗ рд╣реИрдВ) .
...
рдЬрдм рдореЗрд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдирд┐рдХрд╛рд▓реЗрдВ (FILE_SHARE_DELETE рдЪрд╛рд▓реВ рд╣реИ):
...
рдЕрдкрд▓реЛрдбрд░ рдХреЛ рдпрд╣ рдмрддрд╛рддреЗ рд╣реБрдП рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреА рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛ рджреА рдЧрдИ рд╣реИ (рд╢рд╛рдпрдж рдИрдУрдПрдл)ред

рдорд╛рди рд▓реЗрдВ рдХрд┐ "рдЕрдкрд▓реЛрдбрд░" "рдореЗрд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо" рдХреЙрд▓ рдУрдПрд╕ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддрд╛ рд╣реИред рдирд┐рдХрд╛рд▓реЗрдВ (), рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд╡рд┐рди рдПрдкреАрдЖрдИ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХрд╛ рдЦрдВрдбрди рдХрд┐рдпрд╛ рд╣реИ:

_DeleteFile рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛рдирд╛ рддрдм рддрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдВрддрд┐рдо рд╣реИрдВрдбрд▓ рдмрдВрдж рди рд╣реЛ рдЬрд╛рдПред рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП CreateFile рдкрд░ рдмрд╛рдж рдХреА рдХреЙрд▓ ERROR_ACCESS_DENIED рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред

"рдХреНрд░рд┐рдПрдЯрдлрд╛рдЗрд▓ рдХреЗ _open_osfhandle() рдХреЛ рдПрдХ _fdopen рдореЗрдВ рдЬреЛрдбрд╝рдирд╛", рдХреНрдпрд╛ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдпрджрд┐ рд╣рдо FILE_SHARE_DELETE рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЧрд▓рддреА рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпреВрдирд┐рдХреНрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдб-рдмрд╛рдзрд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕реЗ os.NewFile() рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ FILE_SHARE_DELETE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдкреНрд░рддреНрдпреЗрдХ рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдб-рдмрд╛рдзрд╛рдУрдВ рд╕реЗ рдЕрд▓рдЧ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ ... рдУрдПрд╕ рдкрд░ рд▓реМрдЯреЗрдВред рдиреНрдпреВрдлрд╛рдЗрд▓ (), рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ FILE_SHARE_DELETE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

os.OpenFile() рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЛ рд╕рднреА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИ:

рдУрдПрд╕ рдУрдкрдирдлрд╛рдЗрд▓ ()
рдУрдкрдирдлрд╛рдЗрд▓рдиреЛрд▓реЙрдЧ ()
рдЦреБрд▓реА рдлрд╛рдЗрд▓()
рдУрдкрдирдбрд┐рд░ ()
рдирдИ рдлрд╝рд╛рдЗрд▓()
рдлрд┐рдХреНрд╕рд▓реЙрдиреНрдЧрдкрд╛рде ()
syscall.Open ()
рдореЗрдХрдЗрдирд╣реЗрд░рд┐рдЯрд╕рд╛ ()

@networkimprov

@guybrand рдЧреЛрд▓рд╛рдВрдЧ-рджреЗрд╡ рд╕реВрддреНрд░ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

рдореЗрд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо "my.data" рдирд╛рдордХ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рджреВрд╕рд░реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ... рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 10 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВ (рдЗрд╕ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ "рдЕрдкрд▓реЛрдбрд░" рдХрд╣рддреЗ рд╣реИрдВ) .
...
рдЬрдм рдореЗрд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдирд┐рдХрд╛рд▓реЗрдВ (FILE_SHARE_DELETE рдЪрд╛рд▓реВ рд╣реИ):
...
рдЕрдкрд▓реЛрдбрд░ рдХреЛ рдпрд╣ рдмрддрд╛рддреЗ рд╣реБрдП рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреА рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛ рджреА рдЧрдИ рд╣реИ (рд╢рд╛рдпрдж рдИрдУрдПрдл)ред

рдорд╛рди рд▓реЗрдВ рдХрд┐ "рдЕрдкрд▓реЛрдбрд░" "рдореЗрд░рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо" рдХреЙрд▓ рдУрдПрд╕ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддрд╛ рд╣реИред рдирд┐рдХрд╛рд▓реЗрдВ (), рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╡рд┐рди рдПрдкреАрдЖрдИ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХрд╛ рдЦрдВрдбрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ?

DeleteFile рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛рдирд╛ рддрдм рддрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдВрддрд┐рдо рд╣реИрдВрдбрд▓ рдмрдВрдж рди рд╣реЛ рдЬрд╛рдПред рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП CreateFile рдХреЗ рдмрд╛рдж рдХреЗ рдХреЙрд▓ ERROR_ACCESS_DENIED рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

"рдХреНрд░рд┐рдПрдЯрдлрд╛рдЗрд▓ рдХреЗ _open_osfhandle() рдХреЛ рдПрдХ _fdopen рдореЗрдВ рдЬреЛрдбрд╝рдирд╛", рдХреНрдпрд╛ рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдореБрдЭреЗ рд╡рд┐рдиреНрдбреЛрдЬрд╝ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ, рдХреГрдкрдпрд╛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдПрдХ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

рдПрдХ рдХреЛрдб рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рдЧреБрдЧрд▓ рдХрд┐рдпрд╛, рдФрд░ рдпрд╣ рдкрд╛рдпрд╛:
http://blog.httrack.com/blog/2013/10/05/creating-deletable-and-movable-files-on-windows/

рд▓реЗрдХрд┐рди
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ - рдпрд╣ рдЖрдкрдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рдХреНрд╕ рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рджреЗрдЧрд╛, рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рдЕрдиреНрдп рдмрд╛рд╣рд░реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЗрд╕реЗ рддреЛрдбрд╝ рджреЗрдЧрд╛ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ 99% рдорд╛рдирдХ рд╡рд┐рдВрдбреЛрдЬрд╝ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ)

@networkimprov
рдпрджрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ "рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ" dir my.data "рдлрд╝рд╛рдЗрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рддрдХ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдерд╛ .... XP рдпрд╛ 7 (рдЬреЛ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ) рдФрд░ рддрдм рд╕реЗ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ (рд╢рд╛рдпрдж рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдмрд╕ рдЫреБрдкрд╛рддрд╛ рд╣реИ рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣) - рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдореИрдВ рдЕрдкрдирд╛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдПрдирд╡реА рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдлрд┐рд░ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред (рд╣рд░ рдХреБрдЫ рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ ...)

рдпрджрд┐ рдЖрдкрдХрд╛ рдорддрд▓рдм рд╣реИ "рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╣реИрдВрдбрд▓ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдлрд┐рд░ рднреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛", рдореИрдВ рд╢рд░реНрдд рд▓рдЧрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рджреВрд╕рд░реА рдмрд╛рд░ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рдлрд╛рдЗрд▓ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ "рдИрдУрдПрдл" рд╢реИрд▓реА рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ - рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ 100% рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрдиреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрд░рд╛ рдореБрджреНрджрд╛ рд╣реЛрдЧрд╛ (рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ - рдореИрдВ "рдореВрд▓" рдмрдирд╛рдо "рдУрдПрд╕-рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА" рдмрд┐рдВрджреБ рдореЗрдВ "рдкрдХреНрд╖" рд▓реЗ рд░рд╣рд╛ рд╣реВрдВ) - рднрд▓реЗ рд╣реА рдЖрдк _fdopen рд╢реИрд▓реА рд╕рдорд╛рдзрд╛рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдХреЗ рдмреАрдЪ рдЕрд╕рдВрдЧрддрддрд╛ рдорд┐рд▓реЗрдЧреА рдФрд░ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╣рдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╕рднреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп, рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЕрдиреНрдп рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп (рдпрд╛ рджреБрд░реНрд▓рдн рд╕реЗрд╡рд╛рдПрдВ рдЬреЛ рдПрдлрдбреА рдХрд╛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ) рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ - рдЖрдкрдХрд╛ рдРрдк "рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдЪрддреБрд░ рдмрдЪреНрдЪрд╛" рд╣реЛрдЧрд╛ - рдЬрд┐рд╕реЗ рдХреЛрдИ рдЕрдиреНрдп рдмрдЪреНрдЪрд╛ рдирд╣реАрдВ рд╕рдордЭ рд╕рдХрддрд╛ред
рдореИрдВ рдмрд╣реБрдд рд╕реЗ рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ:
рдЗрдирдкреБрдЯ :
рдореЗрд░рд╛ рдРрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдПрдВрдЯреАрд╡рд╛рдпрд░рд╕ рдЕрдкрдиреЗ рд╣рд░рдлреБрд▓ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ/рд╕рдВрдЧрд░реЛрдз (== рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдХрд╛рд░) рдЗрд╕реЗ, рдЕрдЧрд░ рдореИрдВ fd рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рдореЗрд░рд╛ рдРрдк рдЕрднреА рднреА рдЗрд╕рдХреЗ рд╕рд╛рде рдЬреЛ рдХреБрдЫ рднреА рдЪрд╛рд╣рддрд╛ рд╣реИ рд╡рд╣ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ (рдЬреЛ рдХреЙрд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдПрдХ рд╡рд╛рдпрд░рд╕ рдорд╛рд░ рд░рд╣рд╛ рд╣реИ ...)
рдЖрдЙрдЯрдкреБрдЯ :
рдореЗрд░рд╛ рдРрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рджреВрд╕рд░реЗ ("рдЕрдкрд▓реЛрдбрд░" рдЬреИрд╕реЗ) рд╕реЗрд╡рд╛ рдореЗрдВ рдкрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдореИрдВрдиреЗ рднреА рдкрд░реЗрд╢рд╛рди рдХрд┐рдпрд╛ рдФрд░ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдХ рд▓рд┐рдЦрд╛ рдХрд┐ рд╕рдм рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ - рдФрд░ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рдореЗрд░реЗ рдЧреЛ рдЯреЗрд╕реНрдЯ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдлрд╛рдЗрд▓рдЬрд╝рд┐рд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд╣рдо рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рддреЗ рд╣реИрдВ, рдбреНрд░реЙрдкрдмреАрдПрдХреНрд╕ рдПрдкреАрдЖрдИ, рдЬреЛ рднреА рд╣реЛ
рдпрд╣ рдЕрд╕рдлрд▓ рд╣реЛрдЧрд╛/рдЙрд╕реА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ...

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдмрджрд▓рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ?

рдХреНрдпрд╛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рдЗрд╕ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд╖рдорддрд╛ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдФрдЪрд┐рддреНрдп рд╣реИ?

рдореИрдВрдиреЗ рдЙрд╕ рдкреНрд░рд╢реНрди рдкрд░ рдХрднреА рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред

рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЧреЛ рдлрд╛рдЗрд▓реЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ, рд╡рд╣ рдореЗрд░реЗ рдЬреАрд╡рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╕рднреА рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реЛрдЧреА, рдЕрдЧрд░ рдЧреЛ рдлрд╛рдЗрд▓реЗрдВ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреАред рдореБрдЭреЗ рдпрд╣ рднреА рд╕рдВрджреЗрд╣ рд╣реИ, рдпрд╣ рдХрдИ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред

рдПрд▓реЗрдХреНрд╕

рдореБрдЭреЗ рдпрд╣ рднреА рд╕рдВрджреЗрд╣ рд╣реИ, рдпрд╣ рдХрдИ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред

@alexbrainman рдореИрдВрдиреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рд┐рдЪ рдХрд╛ рднреА рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред

@bradfitz syscall.SocketDisableIPv6 рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ syscall.Open() рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИред

рдЪреВрдВрдХрд┐ syscall_windows*.go рдмрддрд╛рддрд╛ рд╣реИ
func рдУрдкрди (рдкрде рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдореЛрдб рдЗрдВрдЯ, рдкрд░реНрдо uint32) (рдПрдлрдбреА рд╣реИрдВрдбрд▓, рддреНрд░реБрдЯрд┐ рддреНрд░реБрдЯрд┐) {
....
рд╢реЗрдпрд░рдореЛрдб: = uint32 (FILE_SHARE_READ | FILE_SHARE_WRITE)

рдФрд░ type_windows*.go has
FILE_SHARE_DELETE = 0x00000004

рд╕рдм рдХрд╛рдлреА рддреИрдпрд╛рд░ рд╣реИ, рдПрдХ рд╣реА рд╕рд╡рд╛рд▓ рд╣реИ рдХрд┐ рдЭрдВрдбреЗ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдореБрдЭреЗ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд┐рдХрд▓реНрдк рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЬрдмрдХрд┐ рдПрдХ рдПрдХрд▓ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдпрд╛рдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдиреЗ os.DeleteUponLastHandleClosed = 1 рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рдпрд╛ рдПрдХрд╛рдзрд┐рдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИред
рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдпрд╛ рддреЛ рдЭрдВрдбреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд░рдХреНрд╖рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬреИрд╕реЗ:
рдПрдлрдбреА, рддреНрд░реБрдЯрд┐: = os.OpenFile (рдкрде, os.O_RDWR|os.O_CREATE|os.DELETE_WHEN_FREED, 0600)
рдЬрдмрдХрд┐ env рдХреЗ рд▓рд┐рдП DELETE_WHEN_FREED 0 рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛,

рдПрдХ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдкрд░реНрдо рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдПрдлрдбреА, рддреНрд░реБрдЯрд┐: = рдУрдПрд╕ред рдУрдкрдирдлрд╛рдЗрд▓ (рдкрде, рдУрдПрд╕ред рдУ_рдЖрд░рдбреАрдбрдмреНрд▓реНрдпреВрдЖрд░ | рдУрдПрд╕ред рдУ_рдХреНрд░рд┐рдПрдЯ, 777)
777 рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдпрд╛ рддреЛ 1777 рдпрд╛ -777 ro рджреЛрдиреЛрдВ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА
рдмрдирд╛рдирд╛ рдкрдардиреАрдп рд╣реИ DELETE_WHEN_FREED | 777

рдЖрдЦрд┐рд░реА рд╡рд┐рдХрд▓реНрдк рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ os.OpenDeletableFile(
рдЬреЛ рд╣реЛрдЧрд╛ os.OpenFile рдирд┐рдХреНрд╕ рдкрд░ рдФрд░
рдореЛрдбрд╝
рд╢реЗрдпрд░рдореЛрдб: = uint32 (FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE)
рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдкрд░

рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╕рдорд╛рдзрд╛рди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИрдВ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдФрд░ рд╕рдордп (рдХреНрд░реЙрд╕ рдУрдПрд╕), рдмрд╕ рдПрдХ рдорддрджрд╛рддрд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИ ...

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдпрд╛ рдПрдкреАрдЖрдИ рд╕рддрд╣ рдХреЛ рдмрдврд╝рд╛рдП рдмрд┐рдирд╛ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ flag рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ os.OpenFile syscall.FILE_SHARE_DELETE рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕реЗ рдХрдВрдкреНрдпреВрдЯреЗрдб рдореЗрдВ рдлреЛрд▓реНрдб рдХрд┐рдпрд╛ рдЬрд╛рдП sharemode рдореВрд▓реНрдпред рдЪреВрдВрдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ syscall.O_* (рдФрд░ рдЗрд╕рд▓рд┐рдП os.O_* ) рдЭрдВрдбреЗ рд╡реИрд╕реЗ рднреА рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ , рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рд╡рд┐рдВрдбреЛрдЬрд╝-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЭрдВрдбреЗ рд╕реЗ рдЯрдХрд░рд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЬреАрдирд┐рдпрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЛрдИ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА syscall.FILE_SHARE_DELETE рд╕рд╛рде рдЯрдХрд░рд╛рд╡ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред

рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдореЗрдВ, рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдХрдбрд╝рд╛ рд╡рд┐рд░реЛрдз рдХрд░реВрдВрдЧрд╛ред FILE_SHARE_DELETE рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛рдирд╛ рдЖрдкрдХреЛ рд░реЗрд╕-рдлреНрд░реА рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реЛрдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ POSIX рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд╛рд▓ рджреЗрдЧрд╛ред рдпрд╣ рдзреНрд╡рдЬ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЛ openat , renameat , readlinkat , рдЖрджрд┐ рдХреЗ рд╕рдордХрдХреНрд╖ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдмрд╛рдд рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ:

рдХреНрдпрд╛ рдЖрдк syscall_windows.go рдореЗрдВ рдПрдХ рд╕реНрд╡рд┐рдЪ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдпреВрдирд┐рдХреНрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХреЗрдВ?

рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рд╕реЗ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

@рд╣рд╛рд╡реЛрдХ-рдЖрдИрдУ
рдЖрдкрдХрд╛ рд╕реБрдЭрд╛рд╡ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╡рдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ syscall.FILE_SHARE_DELETE POSIX std рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдЕрд▓рдЧ рд╣реИред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ syscall_windows*.go рдХреЗ рд▓реЗрдЦрдХ FILE_SHARE_DELETE рдзреНрд╡рдЬ (рдЗрд╕рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рдереЗ рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрджреАрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдХреНрдпреЛрдВ?

рдЪрд▓реЛ рд▓рд┐рдпрд╛рдо рдХрд╛ рдХреЛрдб рд▓реЗрддреЗ рд╣реИрдВ, рд╣реЗ
рдПрдлрдбреА рд╕реНрдердЧрд┐рдд рдХрд░реЗрдВред рдмрдВрдж рдХрд░реЗрдВ ()
рд╣рдЯрд╛рддрд╛/рдирд╛рдо рдмрджрд▓рддрд╛ рд╣реИ
рдФрд░ рдлрд┐рд░ рдкрдврд╝реЗрдВ/рд▓рд┐рдЦреЗрдВ

рддреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реЙрд░реНрдЯ рдСрд░реНрдбрд░ рд╣реИ
рдЦреБрд▓рд╛ рд╣реБрдЖ
рд╣рдЯрд╛рдП рдЧрдП рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ
рдкрдврд╝реЗрдВ/рд▓рд┐рдЦреЗрдВ (рдФрд░ рд╢рд╛рдпрдж рдХреНрд░реЙрд╕ рдкреНрд░реЛрд╕реЗрд╕/рдХреНрд░реЙрд╕ рдЧреЛ рд░реВрдЯреАрди рд░реАрдб рд░рд╛рдЗрдЯ рднреА рд▓рд┐рдЦреЗрдВ)
рдмрдВрдж рдХрд░реЗ

рд╡рд░реНрддрдорд╛рди рд╡рд┐рдВрдбреЛрдЬрд╝ рд╡реНрдпрд╡рд╣рд╛рд░ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрд▓рд░реНрдЯ рдХрд░рддрд╛ рд╣реИ "рдпрд╣ рдЧрд▓рдд рд╣реИ", рдбреЗрд╡рд▓рдкрд░ рд╢рд╛рдпрдж рдбрд┐рд▓реАрдЯ рдХреЛ рднреА рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдХреНрдХрд╛ рджреЗрдЧрд╛
рдпрджрд┐ рдЖрдк FILE_SHARE_DELETE рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдЖрдкрдХреЛ "рдлрд╛рдЗрд▓ рдХреЗ рдЦреБрд▓рдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдбрд┐рд▓реАрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ" рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ / рдЧреЛрд░реЛрдЗрди рд╕рдорд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдЪрд▓ рд░рд╣реА рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд┐рд▓реАрдЯ рдФрд░ рдХреНрд▓реЛрдЬ рдХреЗ рдмреАрдЪ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧреА (рдЬреЛ рд╢рд╛рдпрдж рдЗрд╕ рдХреЛрдб рдореЗрдВ рд▓рдВрдмрд╛ рдХрд╛рдо рд╣реИ) ) рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛
рдкрд░рд┐рдгрд╛рдо: рдПрдХ рд╕реБрд╕рдВрдЧрдд "рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ" рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрдЬрд╛рдп - рдЖрдкрдХреЛ "рдХрднреА-рдХрднреА - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рдХрдИ рд╕рдорд╡рд░реНрддреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдХреНрдпреЛрдВред
рддреЛ рдЖрдк рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмрд╕ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕ рдкрд░ рдбреЗрд╡рд▓рдкрд░ "рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЪрд▓рд╛рдПрдВ"
рдореЗрд░рд╛ рд╡реЛрдЯ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд▓рдЧрд╛рддрд╛рд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рд╣реИ ...

рдпрд╣ Posix рд╕реЗ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рднрд┐рдиреНрди рд╣реИ?
рдПрдХ рдмрд╛рд░ рд╣рдЯрд╛рдП рдЧрдП рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдЕрдм рдлрд╝рд╛рдЗрд▓ рддрд╛рд▓рд┐рдХрд╛ рдкрд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ fd рдХреЗ рд░реВрдк рдореЗрдВ рдореМрдЬреВрдж рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрдиреНрдп рд░реВрдЯреАрди/рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЙрд╕реА рдирд╛рдо рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ "рд╕рдорд╛рди рд╕рдорд╛рдзрд╛рди" рдХреА рддрд▓рд╛рд╢ рдмрдВрдж рдХрд░ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдРрд╕реЗ рдорддрднреЗрдж рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЬрд╛рдиреЗ рдХреЗ рднреАрддрд░ рд╣рд▓ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ (рдХреЗрд╕ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо? :) рд╣рдо рд▓рд┐рдирдХреНрд╕ 5.2 рдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рджреЗрдВрдЧреЗ ...)

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рд╣реИ, рдпрджрд┐ рдпрд╣ рд╣реИ, рддреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ GetTempFileName рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ рдЬрд┐рд╕реЗ "рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдФрд░ рдлрд┐рд░ рдЯреНрд░реИрд╢ рдХреА рдЧрдИ" рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдпрджрд┐ рджреВрд╕рд░реА рдУрд░ рд╣рдо рдХрд┐рд╕реА рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рдбрд┐рд▓реАрдЯ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рдКрдкрд░ рдореЗрд░реЗ рд╕реБрдЭрд╛рд╡ рджреЗрдЦреЗрдВ, рд▓реЗрдХрд┐рди рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЗрд╕рдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд▓реЗрдиреА

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЙрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рд╣реИ:

fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0600)
_, err = fd.Write(...)
err = fd.Sync()  // file now safe to share
err = os.Rename(path, shared_path)
// os.Close() at program exit

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдк os.O_WRNDEL рдлреНрд▓реИрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ (рд╡рд┐рдВрдбреЛрдЬрд╝ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ/рд╣рдЯрд╛рдПрдВ; рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдиреЛ-рдСрдк), рдФрд░ рдпреВрдирд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдЙрд╕ рдореЛрдб рдХреЗ рдЕрдВрддрд░ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░реЗрдВ; рдХрд┐ рдПрдХ рд╣рдЯрд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдЙрд╕рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдмрдиреА рд░рд╣рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ os.Close() рдирд╣реАрдВ рдЦреЛрд▓реА рдЬрд╛ рд╕рдХрддреАред рдпрд╣ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдбреАрдЖрдИрдЖрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЕрдзрд┐рдХ рдпреВрдирд┐рдХреНрд╕ рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

@guybrand рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢рд╛рдпрдж рдЖрдк рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЧрд▓рдд рд╕рдордЭ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХреА рд╡рдХрд╛рд▓рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ FILE_SHARE_DELETE рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реЛ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЗрд╕рдХрд╛ рд╡рд┐рд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореЗрд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдПрдХ рдРрд╕реЗ рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдерд╛ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ FILE_SHARE_DELETE рд╡реНрдпрд╡рд╣рд╛рд░ (рдкреНрд░рддрд┐-рдлрд╝рд╛рдЗрд▓ рдЖрдзрд╛рд░ рдкрд░) рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯ-рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрднреА рднреА os рдкреИрдХреЗрдЬ рдХреА рдлрд╝рд╛рдЗрд▓ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд┐рд╕реА рднреА рдкреИрдХреЗрдЬ рдХреА рдПрдкреАрдЖрдИ рд╕рддрд╣ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдк os.O_WRNDEL рдзреНрд╡рдЬ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ (рд╡рд┐рдВрдбреЛрдЬрд╝ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ/рд╣рдЯрд╛рдПрдВ; рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдиреЛ-рдСрдк)

@networkimprov рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдПрдХ рдирдП рдзреНрд╡рдЬ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдз рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ: syscall.FILE_SHARE_DELETE ред рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░рд┐рд╡рд░реНрддрди рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ syscall.Open рдореЗрдВ рджреЗрдЦрдирд╛ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ syscall.O_* / os.O_* рдЭрдВрдбреЗ рдореЗрдВ рдХреЛрдИ рднреА рдЬреЛрдбрд╝ рдЗрд╕ рдзреНрд╡рдЬ рд╕реЗ рдирд╣реАрдВ рдЯрдХрд░рд╛рдПрдЧрд╛ред os.OpenFile рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рддрдм Windows рдкрд░ рдЗрд╕ рдзреНрд╡рдЬ рдХреА рд╕реНрд╡реАрдХреГрддрд┐ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@ рдХрд╣рд░-рдЖрдИрдУ рдЧрд▓рддрдлрд╣рдореА рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рдпрд╣ рдореЗрд░рд╛ рдЯреЗрдХрдЖрдЙрдЯ рдерд╛:
"... syscall.FILE_SHARE_DELETE ... рдХреЛ рдХрдВрдкреНрдпреВрдЯреЗрдб рд╢реЗрдпрд░рдореЛрдб рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП..."

рдореЗрд░реЗ рджреВрд╕рд░реЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рд╕рд╛рде os.O_WRNDEL рдореИрдЪреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ "рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛" рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢рд╛рдпрдж os.WADRNDEL - рд╡рд┐рдВрдбреЛрдЬрд╝ рдЖрд╕реНрдердЧрд┐рдд рдирд╛рдо рдмрджрд▓рдиреЗ / рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ)ред

@alexbrainman рдореИрдВрдиреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рд┐рдЪ рдХрд╛ рднреА рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛

рдореБрдЭреЗ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реВрдБред рд╢реБрдХреНрд░рд┐рдпрд╛ред

рдПрд▓реЗрдХреНрд╕

@guybrand рдПрдХ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рд╕реНрдердЧрд┐рдд рдирд╣реАрдВ рд╣реИ, рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреАред

рдорд╛рдлрд╝ рдХрд░реЗрдВ, рдореИрдВ рдлрд┐рд░ рд╕реЗ рдкреВрдЫ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ? рдУрдкрдирд┐рдВрдЧ рдлрд╛рдЗрд▓ рдХреЛ рдбрд┐рд▓реАрдЯ рдХрд░реЗрдВ? рдЙрджреНрдШрд╛рдЯрди рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ? рджреЛрдиреЛрдВ?

рд╣рдо рдореЗрдВ рд╕реЗ рддреАрди рдЕрдм рдПрдХ рдирдП рдЭрдВрдбреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕реЗ

fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE| os._WRNDEL, 0600)

fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE| syscall.FILE_SHARE_DELETE, 0600)

рд╣рдо рддреАрдиреЛрдВ рдЕрдм рдПрдХ рдирдП рдЭрдВрдбреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рдЭрдВрдбрд╛ рдЕрдиреБрдЪрд┐рдд рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд╣ рдЬреЛ рдХреЛрдб рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред syscall.FILE_SHARE_DELETE рдХрд░рдирд╛ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛, рдкрд╛рдардХ рдХреЛ рддреБрд░рдВрдд рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ рдХрд┐ рдХреБрдЫ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛ рд░рд╣рд╛ рд╣реИред

POSIX рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИред рдХрдИ POSIX- рд╡рд┐рд╢рд┐рд╖реНрдЯ (рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ) open рдлрд╝реНрд▓реИрдЧ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ os рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд╛рд░реНрд╡рд┐рди рдХреЗ O_EVTONLY рдзреНрд╡рдЬ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП os._DEVTONLY рдЬреИрд╕рд╛ рдХреБрдЫ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдзреНрд╡рдЬ рдХреЛ syscall рдкреИрдХреЗрдЬ рд╕реЗ рд╕реАрдзреЗ os.OpenFile , рдЬреИрд╕реЗ:

os.OpenFile(..., os.O_RDONLY | syscall.O_EVTONLY, ...)

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝реНрд▓реИрдЧ рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд open рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдореЗрдВ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрджрд┐ FILE_SHARE_DELETE рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕рдХреА рд▓реЛрдЧреЛрдВ рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдХреЗрд╡рд▓ os.OpenFile рдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд CreateFileW рдХреЙрд▓ рдХреЗ рд╕рдорд╛рди рдереНрд░реЗрдб рдлрд╝реНрд▓реИрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рдирд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо FILE_SHARE_DELETE ред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛

@networkimprov

рд╣рдо рдореЗрдВ рд╕реЗ рддреАрди рдЕрдм рдПрдХ рдирдП рдЭрдВрдбреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рдЬреИрд╕реЗ

рдЖрдк рдЭрдВрдбреЗ рдХреА рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ?

@guybrand рдПрдХ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рд╕реНрдердЧрд┐рдд рдирд╣реАрдВ рд╣реИ, рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреАред

рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рд╛рдЗрд▓ рдЦреБрд▓реА рд░рд╣рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХреЛ FILE_SHARE_DELETE рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдпрджрд┐ рдЖрдк рдореЗрд░реА рд╕реБрдЭрд╛рдИ рдЧрдИ рд╢рдмреНрджрд╛рд╡рд▓реА рдХреА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
os.WARNDFDEL - рд╡рд┐рдВрдбреЛрдЬрд╝ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╕реНрдердЧрд┐рдд рд╣рдЯрд╛рдирд╛ рдереЛрдбрд╝рд╛ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реИ, рдореИрдВ рд╕реНрд╡рдпрдВ WINDOWS_ALLOW_OPENNED_FILE_RENAME_OR_DEFFERED_DELETE рдкрд░ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛
рдмреЗрд╣рддрд░ рдЖрдИрдПрдордУ рд╣реИред

@guybrand рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ os рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рдЬрдЯрд┐рд▓ рдирд╛рдо рдФрд░ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзреНрд╡рдЬ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬрдм рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдЪреНрдЫрд╛ рдЭрдВрдбрд╛ рджрд╢рдХреЛрдВ рд╕реЗ рд╣реИ ( FILE_SHARE_DELETE )ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдХреЗ рд░реВрдк рдореЗрдВ syscall.FILE_SHARE_DELETE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ os рдкреИрдХреЗрдЬ рдореЗрдВ рдирд╣реАрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВ рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

syscall.FILE_SHARE_DELETE рдХреЗрд╡рд▓ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╣реИ; рд╣рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд╣реАрдВ рдФрд░ рди рд╣реЛред рд╢рд╛рдпрдж рдпрд╣ рдЬреАрдд рдпрд╛ рд╡рд┐рдиреНрдбреЛрдЬрд╝ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рдкреАрдХреЗрдЬреА рдУрдПрд╕ рдореЗрдВ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП?

@mattn рдХреГрдкрдпрд╛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдкреИрдЪ рдХреЛ @ havoc-io . рд╕реЗ рджреЗрдЦреЗрдВ

рд╣рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд╣реАрдВ рдФрд░ рди рд╣реЛред

@networkimprov рдзреНрд╡рдЬ рдХреЛ рдХрд╣реАрдВ рдФрд░ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХрд╛ рд╡рд┐рдВрдбреЛрдЬ рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

import (
    "syscall"
    "os"
)

file, err := os.OpenFile(..., os.O_RDWR | syscall.FILE_SHARE_DELETE, ...)

рд╣рд╛рдВ, рдЗрд╕ рдХреЛрдб рдХреЛ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдЧреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╢рд╛рдпрдж рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╡рд╣рд╛рд░ POSIX рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдПрдЧрд╛ред рдпрд╛, рдпрджрд┐ рдЖрдк рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рд╕рдорд╛рди рдХреЛрдб рд░рдЦрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ syscall.FILE_SHARE_DELETE рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдФрд░ рдЧреИрд░-рд╡рд┐рдВрдбреЛрдЬ рд╕рд┐рд╕реНрдЯрдо рдкрд░ 0 рд╕рд╛рде) рдФрд░ рдкрд╛рд╕ рдХрд░реЗрдВ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП os.OpenFile ред рдпрджрд┐ рдЖрдк рдПрдХ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ O_* рдлрд╝реНрд▓реИрдЧ рд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ os рдкреИрдХреЗрдЬ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рдерд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдбрд╛рд░реНрд╡рд┐рди рдкрд░ O_EVTONLY O_ASYNC рд▓рд┐рдирдХреНрд╕ рдкрд░)ред

рдЬрдм рдореИрдВ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд░реЙрд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реЛрдЧрд╛, FILE_SHARE_DELETE syscall_* рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рдХреЗрд╡рд▓ рд╡рд┐рдВрдбреЛрдЬрд╝ рдПрдХ (рдЗрд╕рд▓рд┐рдП рдЕрдиреНрдп рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛)ред

рдХреНрдпрд╛ рд╣рдо рдЗрд╕рдХреЗ рд░реВрдк рдореЗрдВ 0x4 рдХрд╛рд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
FILE_SHARE_DELETE = 0x00000004

рдмрджрд╕реВрд░рдд рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛,
netbsd_arm
O_NDELAY = 0x4
рдУ_рдиреЙрдирдмреНрд▓реЙрдХ = 0x4

рддреЛ 0x4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╡рд╣ рдХреЛрдб рдмрди рдЬрд╛рдПрдЧрд╛ рдЬреЛ netbsd_arm.

рддреЛ рдпрд╛ рддреЛ рд╣рдо рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдореЗрдВ FILE_SHARE_DELETE рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд╡рд┐рдВрдбреЛрдЬрд╝ рд╡рд╛рд▓реЗ 0x4 рд╣реЛрдВрдЧреЗ рдЕрдиреНрдп 0x0 рд╣реЛрдВрдЧреЗ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕реЗ "рддреНрдпрд╛рдЧреЗрдВ", рдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзреНрд╡рдЬ рдмрдирд╛рдПрдВред

рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╣рдореЗрдВ syscall_windows* рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛
рдлрдВрдХ рдУрдкрди (
...
рд╢реЗрдпрд░рдореЛрдб: = uint32 (FILE_SHARE_READ | FILE_SHARE_WRITE | isDeleteOn)
рдЬрд╣рд╛рдВ isDeleteOn рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ рдХрд┐ рдореЛрдб рдореЗрдВ рдирдпрд╛ рдзреНрд╡рдЬ рд╢рд╛рдорд┐рд▓ рд╣реИ рдпрд╛ рдирд╣реАрдВ

@ рдЧрд╛рдЗрдмреНрд░рд╛рдВрдб

рдЬрдм рдореИрдВ рдХреЛрдб рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд░реЙрд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реЛрдЧрд╛

рдореИрдВ рдЖрдкрдХреЛ рд╕рд╛рд╡рдзрд╛рди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдПрдХ рд╣реА os.OpenFile рдХреЙрд▓ рдХрдИ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рд╕рдВрдХрд▓рд┐рдд рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реИред рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдХрдИ рд╕реБрд░рдХреНрд╖рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ FILE_SHARE_DELETE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд╝рд╛рдЗрд▓ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмреАрдЪ рдЗрддрдиреЗ рдЕрд▓рдЧ рд╣реИрдВ рдХрд┐ рдРрд╕реЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рд╡рд╛рдХрдИ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХрд╛ рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдмреАрдЪ рдХрдо рд╕реЗ рдХрдо рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдирд╣реАрдВ рджрд┐рдЦреЗрдЧрд╛ред FILE_SHARE_DELETE рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рдПрдХ рдкреВрд░реНрд╡-POSIX.1-2008 рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд░реЗрд╕-рдлреНрд░реА рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдФрд░ POSIX рдХреЗ рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд╛рдн рдХреЗ рдмрд┐рдирд╛- unlink рдУрдкрди рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓ рдПрдХреНрд╕реЗрд╕ рдлрд╝рд╛рдЗрд▓реЗрдВ)ред

рд╡реИрд╕реЗ рднреА, рдЖрдк рдПрдХ рдзреНрд╡рдЬ рдХреЗ рдПрдХ рдореВрд▓реНрдп рд╣реИ рдХрд┐ рдЪрд╛рд╣рддреЗ рд╣реИрдВ syscall.FILE_SHARE_DELETE рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдФрд░ 0 рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░, рдЖрдк рдЕрднреА рднреА рдЖрд╕рд╛рдиреА рд╕реЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдирд┐рд░рдВрддрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдирд┐рд░реНрдорд╛рдг рдЯреИрдЧ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕рд╛рде рдЖрдкрдХрд╛ рдореБрдЦреНрдп рдХреЛрдб рдЬреЛ os.OpenFile рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рд╕рдорд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрд╕ рдХрд╕реНрдЯрдо рдлрд╝реНрд▓реИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред

рдРрд╕реЗ рдХрдИ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝реНрд▓реИрдЧ рд╣реИрдВ рдЬреЛ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ syscall рдкреИрдХреЗрдЬ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА os рдкреИрдХреЗрдЬ рджреНрд╡рд╛рд░рд╛ рдЙрдЬрд╛рдЧрд░ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрди рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдиреЛ-рдСрдкреНрдб рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡реЗ рд╣реИрдВ' рдЯреА рд╕рдорд░реНрдерд┐рддред рдпрджрд┐ рдЖрдк рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ syscall рдкреИрдХреЗрдЬ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдЧреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ (рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ) рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рд╡рд╣ рд╣реИ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ syscall.FILE_SHARE_DELETE рдореЗрдВ syscall.Open (рдФрд░ рдлрд▓рд╕реНрд╡рд░реВрдк os.OpenFile ) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛

@mattn рдореИрдВ рдЖрдкрдХреА рдЪрд┐рдВрддрд╛рдУрдВ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ - рд▓реЛрдЧ рд╕реВрдХреНрд╖реНрдо рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд╕рдордЭреЗ рдмрд┐рдирд╛ POSIX рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рдХреЛрдб "рд╕рдорд╛рди рдХрд╛рдо" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЙрдиреНрд╣реЗрдВ рдЙрд╕ рдЭрдВрдбреЗ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП syscall рдкреИрдХреЗрдЬ рдореЗрдВ рдЬрд╛рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред

@mattn , рдпреВрдирд┐рдХреНрд╕ рдЬреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП, рдРрдкреНрд╕ рдХреЛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рддрдЯрд╕реНрде рдХреЛрдб рдХреА 2 рдЕрддрд┐рд░рд┐рдХреНрдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

fd, err := os.OpenFile(path, ... | syscall.FILE_SHARE_DELETE, 0600)
...
tmp_path := mkTempName()
err = os.Rename(path, tmp_path)  // works immediately; path is now available
err = os.Remove(tmp_path)

рдЗрд╕рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП os.OpenFile() рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдПрдХ рд╡рд╛рдХреНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдХреГрдкрдпрд╛ рдореБрдЭреЗ pkg syscall рдХреЛ рдПрдХ рдкреИрдЪ рд╡рд┐рддрд░рд┐рдд рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВ рдХрд┐ рдореЗрд░реЗ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЛрдб рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛! https://github.com/golang/go/issues/32088#issuecomment -493876119 рднреА рджреЗрдЦреЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рдЕрдзрд┐рдХрд╛рдВрд╢ рддрдереНрдпреЛрдВ рдкрд░ рд╕рд╣рдордд рд╣реИрдВ, рдмрд╕ рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рджреЗрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рд░реВрдкрд░реЗрдЦрд╛ рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛:

  1. рд╕рд╣рдордд: Windows рдФрд░ POSIX рдЙрдкрд░реЛрдХреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рднрд┐рдиреНрди рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖реНрдп рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. рд╕рд╣рдордд : FILE_SHARE_DELETE рдХреЛ рдзреНрд╡рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдЙрдкрдпреЛрдЧреА рд╣реИ
  3. рд╕реБрдЭрд╛рд╡: рдЯрд┐рдХрдЯ рдХреЛ "рд╕рдорд░реНрдерди FILE_SHARE_DELETE" рдореЗрдВ рдмрджрд▓рдиреЗ рджреЗрдВ, рддрд╛рдХрд┐ рдпрд╣ рдмрдЧ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХреА рддрд░рд╣ рд▓рдЧреЗ
  4. рдЕрдзрд┐рдХрддрд░ рд╕рд╣рдордд : рдлреАрдЪрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реНрддрд░ рдкрд░ рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдлреНрд▓реИрдЧ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рдЧреЛ рдмреЗрд╕ рдкреИрдХреЗрдЬред

рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЖрдЗрдЯрдо:

  1. syscall_windows.go . рдмрджрд▓реЗрдВ
    рдлрдВрдХ рдУрдкрди (
    ...
    рд╢реЗрдпрд░рдореЛрдб: = uint32 (FILE_SHARE_READ | FILE_SHARE_WRITE | (рдореЛрдб рдФрд░ FILE_SHARE_DELETE) )
  2. рдбреЗрд╡рд▓рдкрд░ рдЬреЛ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛, рд╡рд╣ рдпрд╛ рддреЛ
    file, err := os.OpenFile(..., os.O_RDWR | syscall.FILE_SHARE_DELETE, ...)
    рдпрд╛ рдпрджрд┐ рд╡реЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреНрд░реЙрд╕ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реЛ рддреЛ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдзреНрд╡рдЬ рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛:

mycode_windows.go
const OPENFILEFLAG = syscall.FILE_SHARE_DELETE
mycode_others.go
const OPENFILEFLAG = 0

рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
file, err := os.OpenFile(..., os.O_RDWR | OPENFILEFLAG, ...)

рдпрджрд┐ рдпрд╣ рд╕рд╣рдордд рд╣реИ, рддреЛ рдлрд┐рдХреНрд╕ рдиреНрдпреВрдирддрдо (рдПрдХ рд▓рд╛рдЗрдирд░) рд╣реИ, рдмрд╣реБрдд рдХрдо рдЬреЛрдЦрд┐рдо рдХреЗ рд╕рд╛рде

рдЗрд╕ рдкрд░ рдорддрджрд╛рди рдХрд░рдиреЗ рджреЗрдВ, рдФрд░ рд╣рдо рдЗрд╕реЗ рд╢реАрдШреНрд░рддрд╛ рд╕реЗ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

рд╕рд╣рдордд : FILE_SHARE_DELETE рдХреЛ рдзреНрд╡рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдЙрдкрдпреЛрдЧреА рд╣реИ

рдореИрдВ рдЕрднреА рддрдХ рдЗрд╕рд╕реЗ рд╕рд╣рдордд рдирд╣реАрдВ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХреНрдпрд╛ рд╣реИ?

@mattn рдХреГрдкрдпрд╛ рджреЗрдЦреЗрдВ https://github.com/golang/go/issues/32088#issuecomment -494305074

рдЙрджреНрджреЗрд╢реНрдп: рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЦреЛрд▓реА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдпрд╛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред

рдХреНрдпрд╛ рдЧреБрдо рд╣реИ: syscall_windows.go рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╣рд╛рд░реНрдб рдХреЛрдбрд┐рдд рд╣реИ :
func Open(path string, mode int, perm uint32) (fd Handle, err error) {
...
sharemode := uint32(**FILE_SHARE_READ | FILE_SHARE_WRITE**)

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди:
рдЬрдм рдбреЗрд╡рд▓рдкрд░ рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ 4 (FILE_SHARE_DELETE) рдХреЗ рд╕рд╛рде рдПрдХ рдореЛрдб рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╢реЗрдпрд░рдореЛрдб рддрджрдиреБрд╕рд╛рд░ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛
sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE | **(mode & FILE_SHARE_DELETE)** )

рдореИрдВ рдЕрднреА рднреА рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдирд╛рдо рдмрджрд▓реЗрдВ() рдпрд╛ рдирд┐рдХрд╛рд▓реЗрдВ() рд╕реЗ рдкрд╣рд▓реЗ рдмрдВрдж() рдХреЛ рдХреЙрд▓ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдЧреЛ рдХреЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдХреЛрдб рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдирд╛рдо рдмрджрд▓реЗрдВ () рдпрд╛ рдирд┐рдХрд╛рд▓реЗрдВ () рд╕реЗ рдкрд╣рд▓реЗ рдлрд╛рдЗрд▓реЗрдВ рдмрдВрдж () рджреНрд╡рд╛рд░рд╛ рдмрдВрдж рдХрд░ рджреА рдЬрд╛рддреА рд╣реИрдВред Renamee/Rename рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ Close() рдХреЛ рдХреЙрд▓ рдХреНрдпреЛрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИ @networkimprov рд╡рд┐рдЪрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдореЗрд░рд╛ рдЯреЗрдХрдЖрдЙрдЯ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рд╛рдЭрд╛ рдлрд╝рд╛рдЗрд▓ рд╣реЛрдЧреА - рдореЗрд░рд╛ рдРрдк рдФрд░ рджреВрд╕рд░рд╛ рдРрдк рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рднрд▓реЗ рд╣реА рдореЗрд░рд╛ рдРрдк рдХреНрд░реИрд╢ рд╣реЛ) рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдм рдФрд░ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдмрдирд╛ рджреЗрддрд╛ рд╣реВрдВ, рдЗрд╕реЗ рд╣рдЯрд╛рдПрдВ() рдФрд░ рдЬрдм рдореИрдВ рдЗрд╕реЗ рдмрдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдпрд╛ рдореЗрд░рд╛ рдРрдк рдмрдВрдж рд╣реЛрддрд╛ рд╣реИ - рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИред

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @networkimprov рдирд╛рдо рдмрджрд▓реЗрдВ() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдПрдХ рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧ рдХреЗрд╕ред

рдЬреИрд╕рд╛ рдХрд┐ https://github.com/golang/go/issues/32088#issuecomment -494305074 рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рддрдХ рдПрдХ рдирд╛рдорд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред

@mattn , рдХреГрдкрдпрд╛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рди рджреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХрднреА рднреА рдРрд╕реА OS рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ C рдФрд░ C ++ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд░ рд╕рдХреЗрдВред

рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рднрд▓реЗ рд╣реА рдореЗрд░рд╛ рдРрдк рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдП) рдореЗрд░реЗ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдореМрдЬреВрдж рдирд╣реАрдВ рд░рд╣реЗрдЧреА

@guybrand A defer рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд░реИрд╢ рдореЗрдВ рдЪрд▓рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ os.Remove рдСрдкрд░реЗрд╢рди рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдирд╛ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдУред рдпрджрд┐ рдЖрдк рдРрд╕реА рдлрд╝рд╛рдЗрд▓ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдИ рдЬрд╛рдП, рддреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдЬрд┐рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рд╣рдЯрд╛рддрд╛ рд╣реИ, рдПрдХ рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд╛рди рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рджреЛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рддрд╛рд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдордиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП POSIX рдкрд░ fcntl рддрд╛рд▓реЗ рдФрд░ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ LockFileEx / UnlockFileEx ), рдлрд╝рд╛рдЗрд▓ рдЕрд╕реНрддрд┐рддреНрд╡ рдирд╣реАрдВ .

рдЬреИрд╕рд╛ рдХрд┐ #32088 (рдЯрд┐рдкреНрдкрдгреА) рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рддрдХ рд╣рдореЗрдВ рдПрдХ рдирд╛рдорд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред
@mattn , рдХреГрдкрдпрд╛ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рди рджреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХрднреА рднреА рдРрд╕реА OS рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ C рдФрд░ C ++ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХрд░ рд╕рдХреЗрдВред

@networkimprov рдПрдХ рдирд╛рдо рдмрджрд▓реЗрдВ-рдмрд╛рдж-рдЦреБрд▓рд╛ рдСрдкрд░реЗрд╢рди рдПрдХ рд╡реИрдз рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк HANDLE рдлрд╝рд╛рдЗрд▓ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИрдВ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? FILE_SHARE_DELETE рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрджреНрджреЗрд╢реНрдп рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреБрд▓рд╛ рд░рдЦрдиреЗ рдХреЗ рджреМрд░рд╛рди рдЙрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдЕрднреА FILE_SHARE_DELETE рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдмрд╕ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ CreateFileW рдЖрд╣реНрд╡рд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ os.NewFile рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред рдЖрдк рдЗрд╕ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣рд╛рдБ ред рдкрд░рд┐рдгрд╛рдореА HANDLE рдХреЛ рдХреЗрд╡рд▓ os.NewFile рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@mattn рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реЛрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЭрдВрдбрд╛ рдПрдХ рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдлреБрдЯрдЧрди рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛ред рдмрд╕ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдзреНрд╡рдЬ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реНрдХ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ POSIX рдФрд░ Windows рдХреЗ рдмреАрдЪ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдкреВрд░реНрдгрддрд╛ рдФрд░ рд╕рдорд╛рдирддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ CreateFileW (рдЗрд╕ рдзреНрд╡рдЬ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗ рд╕рд╛рде) рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рднреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ os.NewFile рд╕реМрдВрдк рджреЗрдВ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдЗрд╕рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВред

@ рдХрд╣рд░- io рдХреЛрдИ os.File.Rename() рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рднрд╛рд░реА рд▓рд┐рдлреНрдЯ рд╣реИред

рдлрд┐рд░ рд╕реЗ CreateFileW + os.NewFile (), https://github.com/golang/go/issues/32088#issuecomment -493876119 рджреЗрдЦреЗрдВред

@рд╣рд╛рд╡реЛрдХ-рдЖрдИрдУ

рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рднрд▓реЗ рд╣реА рдореЗрд░рд╛ рдРрдк рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдП) рдореЗрд░реЗ рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдореМрдЬреВрдж рдирд╣реАрдВ рд░рд╣реЗрдЧреА
@guybrand рд╣рд░ рдкреНрд░рдХрд╛рд░ рдХреА рджреБрд░реНрдШрдЯрдирд╛ рдореЗрдВ рдПрдХ рд╕реНрдердЧрд┐рдд рдмрдпрд╛рди рдЪрд▓рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ
рдпрд╣реА рдореЗрд░рд╛ рдорддрд▓рдм рдерд╛, рдЬрдм рдореИрдВрдиреЗ рдХрд╣рд╛ "рднрд▓реЗ рд╣реА рдореЗрд░рд╛ рдРрдк рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдП"ред

рдЗрд╕рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд░реНрдХ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ POSIX рдФрд░ Windows рдХреЗ рдмреАрдЪ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдкреВрд░реНрдгрддрд╛ рдФрд░ рд╕рдорд╛рдирддрд╛ рд╣реИ
рдореИрдВ рдЕрд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ "рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рдмреАрдЪ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдкреВрд░реНрдгрддрд╛ рдФрд░ рд╕рдорд╛рдирддрд╛" рд▓рд╛рдПрдЧрд╛ - рдЖрдИрдПрдордУ рдпрд╣ рдХреЗрд╡рд▓ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рднреНрд░рдорд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд╣реА рд╣реИ рдЬрдм рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВрдиреЗ рдКрдкрд░ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рд╣реИрдВред

CreateFileW рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ
рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЯреНрд╡реАрдХ рд╣реИ, рдЖрд╕рд╛рди рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣ рд░рд╣рд╛ рд╣реИ: "рд╣рдо рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ", рдЬреЛ рдХрд┐ рдПрдХ рдареАрдХ рдирд┐рд░реНрдгрдп рдЖрдИрдПрдордУ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреБрд░реЛрдзрдХрд░реНрддрд╛ @networkimprov рдореБрдЭреЗ рдирд╣реАрдВ рд╣реИред

FYI рдХрд░реЗрдВ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдордиреЗ FILE_SHARE_DELETE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ред

рд╕реАрдПрд▓: https://codereview.appspot.com/823043/

рдПрд░рд▓рд╛рдВрдЧ/рдУрдЯреАрдкреА рдореЗрдВ рдкреНрд░рддрд┐рдмрджреНрдз: https://github.com/erlang/otp/commit/0e02f488971b32ff9ab88a3f0cb144fe5db161b2

рдкрд╛рдпрдерди: https://bugs.python.org/issue15244

@ рдХрд╣рд░- io рдХреЛрдИ os.File.Rename() рдирд╣реАрдВ рд╣реИред рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рднрд╛рд░реА рд▓рд┐рдлреНрдЯ рд╣реИред
рдкреБрди: CreateFileW + os.NewFile (), # 32088 (рдЯрд┐рдкреНрдкрдгреА) рджреЗрдЦреЗрдВред

@networkimprov рдХреНрдпрд╛ рдЖрдк рдХреЗрд╡рд▓ os.Rename(file.Name(), <target>) рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ? рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ FILE_SHARE_DELETE рдЪрд╛рд▓реВ рди рд╣реЛрдиреЗ рдХреА рдпрд╣реА рдЦреВрдмреА рд╣реИ - рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ file.Name() рдЕрднреА рднреА рдХрд┐рд╕реА рдорд╛рдиреНрдп рдЪреАрдЬрд╝ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдлрд╝рд╛рдЗрд▓ HANDLE (рдХреБрдЫ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) renameat рд╕рд╛рде рднреА, рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдкрд░ рдЯреА рдЧрд╛рд░рдВрдЯреА)ред CreateFileW + os.NewFile , рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдЯреИрдХ рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ makeInheritSa рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдЖрдк fixLongPath рдкрде рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдЧрд╛, рдЬреЛ рд╕рдВрднрд╡рддрдГ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@guybrand рдмрд╕ рдореЗрд░рд╛ рдорддрд▓рдм рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ...

рдкреВрд░реНрдгрддрд╛: рдПрдкреАрдЖрдИ рд╕рддрд╣ рдкреВрд░реНрдгрддрд╛ (рдпрд╛рдиреА FILE_SHARE_DELETE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)
рдирд┐рдпрдВрддреНрд░рдг рдХреА рд╕рдорддрд╛: CreateFileW рдорд╛рдзреНрдпрдо рд╕реЗ os.OpenFile рдХреЗ flag рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЭрдВрдбреЗ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ POSIX рдкрд░ syscall.O_NOFOLLOW рд╕реЗ os.OpenFile рд░реВрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ syscall.FILE_FLAG_OPEN_REPARSE_POINT рд╕реЗ os.OpenFile рд░реВрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдлрд┐рд░ рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдХреБрд▓ рд╕рдорд╛рдирддрд╛ рдПрдХ рдкрд╛рдЗрдк рд╕рдкрдирд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ os рдкреИрдХреЗрдЬ рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдПрдкреАрдЖрдИ рдХреЗ рдЖрд╕рдкрд╛рд╕ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдм рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдореИрдВ syscall.CreateFileW рддрдХ рдкрд╣реБрдВрдЪрдХрд░ рдХрд╛рдлреА рдЦреБрд╢ рд╣реВрдВред

@mattn рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред Go CL рдХреЛ syscall.Open() _default_ рдХреЛ рдкреИрдЪ рдХрд░рдирд╛ рдерд╛ред рдЪрд░реНрдЪрд╛ рдУрдкрди() рдХреЗ рд▓рд┐рдП _flag_ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдг рдирд╣реАрдВ рджреЗрддреА рд╣реИред рдпрд╣ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреИрдХреЗрдЬ рдзреНрд╡рдЬ рдХреА рдХрдореА рд╡рд╛рд▓реА os.File рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдпрджрд┐ рдХреЙрд▓рд░ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ/рд╣рдЯрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ - рдПрдХ рджреБрд░реНрд▓рдн рдХреЛрдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛ред

рдкрд╛рдпрдерди рдереНрд░реЗрдб рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИред

Erlang рдиреЗ рдкрд┐рдЫрд▓реЗ рдЫрд╣ рд╡рд░реНрд╖реЛрдВ рд╕реЗ file_share_delete рдХреЛ _default_ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрд╛ рд╣реИред

рдКрдкрд░ рд╕реЗ рдЬреБрдбрд╝реЗ рдПрд░рд▓рд╛рдВрдЧ рдЕрдиреБрднрд╡ рдФрд░ рдкрд╛рдпрдерди рдзрд╛рдЧреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐:

  1. File_share_delete рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ; рдПрдХрдорд╛рддреНрд░ рдЪреЗрддрд╛рд╡рдиреА рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдХреЛ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ (рдПрдХ рдорд╛рдореВрд▓реА рдкрд░рд┐рд╡рд░реНрддрди) рд╕реЗ рддреБрд░рдВрдд рдкрд╣рд▓реЗ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдкрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
  2. рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП file_share_delete рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ MSVC рд░рдирдЯрд╛рдЗрдо рдХреЗрд╡рд▓ O_TEMPORARY рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реВрдВрдЧрд╛ рдХрд┐ syscall.Open() рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ file_share_delete рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ (рдЬреИрд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ) рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП syscall рдХреЛ

рдпрджрд┐ 1.14 рдЪрдХреНрд░ рдХреЗ рджреМрд░рд╛рди рдЙрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рдЖрддреА рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╕реНрдкрд╖реНрдЯ рдзреНрд╡рдЬ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓реВрдВрдЧрд╛ рдХрд┐ syscall.Open() рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ file_share_delete рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЬрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ (рдЬреИрд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ) рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП syscall рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдзреНрд╡рдЬ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

@networkimprov рд╕реВрдХреНрд╖реНрдо рдФрд░ рдЧреИрд░-рд╕реВрдХреНрд╖реНрдо рддрд░реАрдХреЛрдВ рд╕реЗ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ FILE_SHARE_DELETE рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдореБрджреНрджрд╛ рд╣реЛрдЧрд╛ред . рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдлрд╛рдЗрд▓реЛрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдмрд╛рд░-рдмрд╛рд░-рдЪреЗрдХ-рдЯреВ-рдЯрд╛рдЗрдо-рдСрдл-рдпреВрдЬ рдХрдордЬреЛрд░рд┐рдпреЛрдВ рдХреЛ рдЦреЛрд▓ рджреЗрдЧрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рд╡реЗ рдЦреБрд▓реЗ рд░рдЦ рд░рд╣реЗ рд╣реИрдВред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЖрдЧреЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рдмрджрд▓рдирд╛ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдХреНрдпреЛрдВ рд╣реИ рдФрд░ рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рддреЛрдбрд╝рдирд╛ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд╣реИ, рдХреГрдкрдпрд╛ Hyrum's Law рджреЗрдЦреЗрдВ ред

рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЧреЛ рдХрд╛ рд╕рдмрд╕реЗ рдЖрдо рдорд╛рдорд▓рд╛ рд╡рд┐рдХрд╛рд╕ рд╣реИ, рд▓рд┐рдирдХреНрд╕ рдпрд╛ рдЕрдиреНрдп рдпреВрдирд┐рдХреНрд╕ рдкрд░

рдпрджрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдХрд┐рд╕реА рднреА GOOS=windows рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ Linux рдкрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИред

os.Rename() рдФрд░ .Remove() рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЕрдВрддрд░ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рднреА рдЕрдиреБрдорд╛рди рдирд╣реАрдВ рд▓рдЧрд╛рдПрдЧрд╛ рдХрд┐ рд╡реЗ рдореМрдЬреВрдж рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ рдЕрднреА рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░рдиреЗ рд╕реЗ рдореМрдЬреВрджрд╛ рдХреЛрдб рдареАрдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЕрд╕рдВрдЧрддрд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдФрд░ рдЙрд╕ рдкрд░ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рдорджрдж рдорд┐рд▓реЗрдЧреАред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлрд╝рд╛рдЗрд▓_рд╢реЗрдпрд░_рдбрд┐рд▓реАрдЯ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдирд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрд░рд▓рд╛рдВрдЧ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЖрд╕рдкрд╛рд╕ рд░рд╣рд╛ рдерд╛ред

рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЧреЛ рдХрд╛ рд╕рдмрд╕реЗ рдЖрдо рдорд╛рдорд▓рд╛ рд╡рд┐рдХрд╛рд╕ рд╣реИ, рд▓рд┐рдирдХреНрд╕ рдпрд╛ рдЕрдиреНрдп рдпреВрдирд┐рдХреНрд╕ рдкрд░

рдпрджрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдХрд┐рд╕реА рднреА GOOS=windows рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ Linux рдкрд░ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИред

@networkimprov

рдЙрд╕ рддрд░реНрдХ рд╕реЗ, рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЛ рднреА рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдпреЛрдЧреНрдп рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рддрд╛рдХрд┐ рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдореМрдЬреВрджрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЛрдВ рдХреЛ рд░рдирдЯрд╛рдЗрдо/рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдкрд┐рдЫрд▓реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрд╖реА рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╕реАрд╡реАрдИ рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯреНрд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓ рдХрд░ рд╕рдХреЗрдВред

рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЧреЛ рдХреЗ рд░рдирдЯрд╛рдЗрдо рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдФрд░ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреАрдЫреЗ рдХреА рдУрд░ рдЭреБрдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЛ рдорд┐рд░рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред

рд╕рд╛рдЭрд╛ рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕реЗрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рд╕рдорд╛рди рд╣реИред рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЛ рдпрдХреАрдирди рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рд╣реА рдорд┐рд▓рд╛, рдФрд░ POSIX.1-2008 рдХреЛ рдЕрдкрдиреА рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реАрдорд╛рдУрдВ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдкрдбрд╝реЗред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬреИрд╕рд╛ рдХрд┐ @mattn рдиреЗ рдКрдкрд░ рдХрдИ рдмрд╛рд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ FILE_SHARE_DELETE рдЬрдм рдлрд╛рдЗрд▓реЗрдВ рдЦреЛрд▓рдиреЗ рд╕реЗ рд╡рд┐рдВрдбреЛрдЬрд╝ POSIX рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдЕрднреА рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдВрддрд░ рд╣реЛрдВрдЧреЗ рдЬреЛ рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ os.Remove рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред os.Rename рд╡реНрдпрд╡рд╣рд╛рд░ред

рдореИрдВ рддрд░реНрдХ рджреВрдВрдЧрд╛ рдХрд┐ рдпрджрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдЯреВрдЯрд╛ рд╣реБрдЖ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдордЬреЛрд░ рд╣реИ (рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдкреЙрдЬрд╝рд┐рдХреНрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ)ред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╡рд┐рд╡рд┐рдзрддрд╛рдУрдВ рдХреЛ рд╕рдордЭрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рдирд┐рдХрд╛рд▓ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╡рд┐рдХрд╛рд╕ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдореЗрдВ, @ianlancetaylor рдиреЗ рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣рд╛рдВ рдХреЗрд╡рд▓ рдЧреИрд░-рдмреНрд░реЗрдХрд┐рдВрдЧ (рдФрд░ рдЧреИрд░-рд╕реБрд░рдХреНрд╖рд╛-рд╕рдордЭреМрддрд╛) рд╡рд┐рдХрд▓реНрдк syscall.FILE_SHARE_DELETE рдХреЗ рд▓рд┐рдП syscall.Open рдХреЗ flag рддрд░реНрдХ рдореЗрдВ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдирд╛ рд╣реИ, рдпрд╛ рдХреЗрд╡рд▓ рдмрд▓ рджреЗрдирд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ FILE_SHARE_DELETE рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡реЗ CreateFileW + os.NewFile ред рд╣рд╛рдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕реЗ рдереЛрдбрд╝рд╛ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди Win32 рдФрд░ POSIX рдореМрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдЬрд╛рдирд╡рд░ рд╣реИрдВ рдФрд░ рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реИ рдХрд┐ рд░рдирдЯрд╛рдЗрдо рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрддрдирд╛ рд╣реА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рддрдирд╛ рд╡реЗ рдЕрдкрдиреЗ рдорддрднреЗрджреЛрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдЗрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рдмреАрдЪ рдХрдИ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИрдВ рдЬреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЦреБрдж рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЕрдиреБрдорддрд┐ рдореЙрдбрд▓, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ os.File.Chmod рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, os.Chown рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рд╡рд┐рдВрдбреЛрдЬ, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдкреЛрд▓рд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЖрджрд┐ред рдЧреЛ рдХреЗ рд░рдирдЯрд╛рдЗрдо рдФрд░ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд░рддреЗ рд╣реИрдВ (рдФрд░ рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рд╡реЗ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╡рд┐рдХрд╛рд╕ рд╕рдВрдХрдЯ рдХреЗ рд▓рд┐рдП рд░рд╛рдордмрд╛рдг рдирд╣реАрдВ рд╣реИрдВред рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрди рдЕрдВрддрд░реЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рд╣реА рд╕рдВрднрд╛рд▓рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛрдбрд╝рдирд╛ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рд╕рд╣реА рдирд╣реАрдВ рдХрд╣рд╛) рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░рд┐рдХ рдмрдврд╝рдд рдХрд╛ рдорд╛рдорд▓рд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред

рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬрдм рдбреЙрдХрд░ рд▓реЙрдЧ рд░реЛрдЯреЗрдЯ рд▓реЙрдЬрд┐рдХ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбреЙрдХрд░ рдЗрдВрдЬрди рд╕рдХреНрд░рд┐рдп рд▓реЙрдЧ рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░ .1 рдХрд░ рджреЗрдЧрд╛, рдкреБрд░рд╛рдиреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдирдпрд╛ рдмрдирд╛ рджреЗрдЧрд╛ред
рдХреЛрдИ рднреА рдХреНрд▓рд╛рдЗрдВрдЯ рдЬреЛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ docker logs --follow <container> рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд▓реЙрдЧ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣рд╛ рд╣реИ
рдзреНрдпрд╛рди рджреЗрдВрдЧреЗ рдХрд┐ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдШрдЯрдирд╛рдУрдВ рд╕реЗ:
https://github.com/moby/moby/blob/916eabd459fe707b5c4a86377d12e2ad1871b353/daemon/logger/loggerutils/logfile.go#L552 -L593

рдпрд╣ рддрд░реНрдХ рднреА рд╣реИ рдЬреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЛ рдЙрди рдШрдЯрдирд╛рдУрдВ рдХреЛ рддреБрд░рдВрдд рдиреЛрдЯрд┐рд╕ рдХрд░рддрд╛ рд╣реИ:
https://github.com/moby/moby/blob/916eabd459fe707b5c4a86377d12e2ad1871b353/daemon/logger/loggerutils/logfile.go#L670 -L676

рдпрд╣ рд╕рдм рд▓рд┐рдирдХреНрд╕ рдкрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬ рд▓реЙрдЧ рд░реЛрдЯреЗрдЯ рдкрд░ рддреНрд░реБрдЯрд┐ The process cannot access the file because it is being used by another process. рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдпрджрд┐ рд▓реЙрдЧ рдХреЗ рдмрд╛рдж рдХреЛрдИ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИ (рд╕рдорд╕реНрдпрд╛: https://github.com/moby/moby/issues/39274 )

рдЪреВрдВрдХрд┐ рдЙрди рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рд▓реЙрдЧ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдЙрди рд╕рднреА рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдШреБрдорд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рдмрдВрдж рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ syscall.FILE_SHARE_DELETE рд▓рд┐рдП рд╕рдорд░реНрдерди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ

рдирдорд╕реНрддреЗ! рддреНрд╡рд░рд┐рдд рдкреГрд╖реНрдарднреВрдорд┐: рдореИрдВ рдХреНрд░реЛрдо рд╕реАрдЖрдИ рдЗрдВрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред рд╣рдо рдЕрдкрдиреЗ рд▓реЛ рд▓реЗрд╡рд▓ рд╡рд░реНрдХрд░ рдХреЛрдб рдХреЛ рдЧреЛ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдкреНрд░рддрд┐ рджрд┐рди рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╕реИрдХрдбрд╝реЛрдВ рд╣рдЬрд╛рд░реЛрдВ рдкрд░реАрдХреНрд╖рдг рдЖрдордВрддреНрд░рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдкрдврд╝ рд▓реА рд╣реИрдВ рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддреНрдпреЗрдХ рд╡реНрдпрдХреНрддрд┐ рдХреА рд░рд╛рдп рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдФрд░ рд╕рд╣реА рд╕рд╛рд░рд╛рдВрд╢ рд╣реИред

рд╣рдорд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЧреЛ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдмрдирд╛ рд░рд╣рд╛ рд╣реИ, @networkimprov рдХреЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд▓рдХреНрд╖рдг рд╡рд░реНрдгрди рдХреЗ рд╡рд┐рдкрд░реАрддред рдореИрдВ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ "рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдкреЙрдЬрд╝рд┐рдХреНрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдорд╛рди рд▓реЗрдВ" рдорд╛рдорд▓реЗ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджреВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рд╕рд╛рджрд╛ рдЧрд▓рдд рдзрд╛рд░рдгрд╛ рд╣реИ рдФрд░ рдорддрднреЗрджреЛрдВ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдЖрдИрдПрдордПрдЪрдУ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИ, рдЙрд╕ рдкрд░ рдФрд░ рдиреАрдЪреЗред

рд╣рдорд╛рд░реЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ FILE_SHARE_DELETE рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреЗ рдХрд╛рд░рдг, #39274 рдХреЗ рд╕рдорд╛рдиред рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдпрд╣ #25965 рдЕрдВрдХ рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ @ianlancetaylor рдкреВрд░реЗ https://codereview.appspot.com/823043/ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓ рдХреЛ рд▓реЙрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдПрдХ рддрддреНрдХрд╛рд▓ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╣рдо рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдХреНрдпрд╛ @ рдХрд╣рд░-рдЖрдИрдУ рдиреЗ рдХрд╣рд╛ред рддреЛ рдЪрд▓рд┐рдП рдЗрд╕реЗ рднреА рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬ рдХрд░ рджреЗрддреЗ рд╣реИрдВред

рдкреБрди: рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рд╢реЗрд╖ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЗрди рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬрд╝ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдБ:

  • рдмрд┐рд▓реНрдХреБрд▓ рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛
  • рд╡реИрд╢реНрд╡рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдСрдкреНрдЯ-рдЖрдЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдмрджрд▓реЗрдВ (рдпрд╛ рдХреЛрдИ рдСрдкреНрдЯ-рдЖрдЙрдЯ рдирд╣реАрдВ!), рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реИ

рдпрд╣ рд╣рдореЗрдВ рдкреНрд░рддрд┐-рдХреЙрд▓ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдВрдбреЛрдЬрд╝-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рдареАрдХ рдпрд╣реА @guybrand рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред

рдкреВрд░реЗ рд╕рдореНрдорд╛рди рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ @mattn рдЖрдкрддреНрддрд┐ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ @guybrand рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдЙрдЪрд┐рдд рд╣реИред рд╣рд╛рдБ рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬрд╝ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛рдиреЗ рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдХреА рддрд░рд╣ рд╣реИ, рдпрд╣ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИ ред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИред рд╡рд┐рдВрдбреЛрдЬрд╝-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзреНрд╡рдЬ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд░реБрдЦ рдкрд░ рдЖрдкрддреНрддрд┐ рдХрд░рдирд╛ рдХрд┐ "рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЧрд▓рдд рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ" рдПрдХ рддрдереНрдп рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рд░рд╛рдп рд╣реИред рдЖрдк рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдПрдордПрд╕рдбреАрдПрди рдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдирд╣реАрдВ рдкрдврд╝реЗрдВрдЧреЗред рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдЪрд┐рдд рдЖрдкрддреНрддрд┐ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реИрдХрд▓реНрдкрд┐рдХ рдзреНрд╡рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реИрдз рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдордЬрдмреВрдд рдирд╣реАрдВ рд╣реИред

рд╡рд┐рдбрдВрдмрдирд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рддрдХ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреА, рддрдм рддрдХ #25965 рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ CreateFileW рд╕реАрдзреЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 'рдЧреЛ рд░рди' рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ FILE_FLAG_DELETE_ON_CLOSE рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓рд╛ рдХреИрд╕реЗ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдореЗрдВ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ/рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди (golang.org/x/sys?) рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рдореВрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдЬрд╛рди рд╕рдХрддрд╛ рд╣реВрдБ:

  1. рд▓реЙрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╣рдЯрд╛рдиреЗ рдпреЛрдЧреНрдп (рдирд╛рдо рдмрджрд▓рдиреЗ рдпреЛрдЧреНрдп) рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ред
  2. рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛ рдЬреЛ рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рд╣рдЯрд╛ рджреА рдЬрд╛рдПрдЧреАред

1 рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ/рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рд╣рдо logger.SetOutput(file) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

2 рдХреЗ рд▓рд┐рдП, рдирдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рднреА рдмрдирд╛/рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВред

BTW, рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдБ #25965 рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж, рдпрд╣ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреА рд╕реАрдорд╛ рд╣реИред

(рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЦреЛрд▓реА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдореМрдЬреВрдж рд╣реИ)

@mattn рдХреНрдпрд╛ рдЖрдк рд╡реНрдпрд╛рдкрд╛рд░ рдХреЛ рдмреАрдЪ рдореЗрдВ рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ:

  • golang.org/x/sys рдореЗрдВ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдирд╛
  • OpenFile() рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рдзреНрд╡рдЬ (рдкрд╣рд▓реЗ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд!) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ред [1]

рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ рд╣рдо рджреВрд╕рд░реЗ рдХреЗ рдмрдЬрд╛рдп рдкрд╣рд▓реЗ рдХрд╛ рдкрдХреНрд╖ рдХреНрдпреЛрдВ рд▓реЗрдВред

[1] рдореБрдЭреЗ рдЕрднреА рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣рд╛рдБ os.OpenFile () рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдУрдкрди () рдХреЛ рдХреЙрд▓ рдХрд░рддреА рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, syscall рдкреИрдХреЗрдЬ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдВрдж рд╣реИред рддреЛ рдореИрдВ syscall рдкреИрдХреЗрдЬ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдвреВрдВрдв рд░рд╣рд╛ рд╣реВрдВред

BTW, рдореИрдВ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд░рд╣рд╛ рд╣реВрдБ #25965 рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж, рдпрд╣ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреА рд╕реАрдорд╛ рд╣реИред

(рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдБ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рдЦреЛрд▓реА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдореМрдЬреВрдж рд╣реИ)

@mattn рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИред FILE_SHARE_DELETE рдзреНрд╡рдЬ рдЖрдкрдХреЛ рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк рдореВрд▓ рдХреЛ рд╣рдЯрд╛ рд╕рдХреЗрдВред рдЗрд╕рдХрд╛ рд╕рд░рд▓ рдкрд╛рд╡рд░рд╢реЗрд▓ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

# Create folder and open new file with FILE_SHARE_DELETE flag
New-Item -Type Directory -Path C:\folder1
$file = [System.IO.File]::Open("C:\folder1\test.txt", "Create", "ReadWrite", "Delete")

# Create temp folder and move all open files to there
New-Item -Type Directory -Path C:\folder1-removing
Get-ChildItem -Path C:\folder1 -Recurse | Move-Item -Destination C:\folder1-removing\

# Remove original folder
Remove-Item -Path C:\folder1

# Trigger removal for files on temp folder (NOTE! Those will exist on disk until they are closed).
Get-ChildItem -Path C:\folder1-removing -File -Recurse | Remove-Item -Force

# Close file and remove temp folder
$file.Close()
Remove-Item -Path C:\folder1-removing

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, syscall рдкреИрдХреЗрдЬ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдВрдж рд╣реИред рддреЛ рдореИрдВ syscall рдкреИрдХреЗрдЬ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдвреВрдВрдв рд░рд╣рд╛ рд╣реВрдВред

@mattn рдЕрдЧрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдкреАрдЖрдИ рдХреЗ рдЬрдореЗ рд╣реБрдП рд╣реЛрдиреЗ рдХрд╛ рдореБрджреНрджрд╛ рд╣реИ, рддреЛ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ / рдбреЗрдореЛ рдХрд┐рдпрд╛ рд╣реИ, syscall.Open рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ syscall.FILE_SHARE_DELETE , рдПрдкреАрдЖрдИ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ред

рдпрджрд┐ рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдлрд╝реНрд░реАрдЬрд╝ рд╣реИ, рддреЛ рдкрд░рд┐рд╡рд░реНрддрди golang.org/x/sys/windows рдХреЗ Open рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ internal/syscall рдкреИрдХреЗрдЬ рдореЗрдВ рд╡реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред file_windows.go рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА internal/syscall рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рддрдм рдПрдХрдорд╛рддреНрд░ рдЕрд╕рдВрдЧрддрд┐ рдпрд╣ рд╣реЛрдЧреА рдХрд┐ syscall.Open рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рдирд╣реАрдВ рд╕рдордЭреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╡рд┐рдВрдбреЛрдЬ рдПрдкреАрдЖрдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдЧ рд╡реИрд╕реЗ рднреА golang.org/x/sys/windows рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╢рд╛рдпрдж CreateFile рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред Open CreateFile рдмрдЬрд╛рдп Open ред

рд╕рд┐рд╕реНрдХрд▓ рдкреИрдХреЗрдЬ "рд▓реЙрдХ-рдбрд╛рдЙрди" рд╢реБрд░реВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ:
_рдореБрдЦреНрдп рднрдВрдбрд╛рд░ go.sys рд╕рдВрдХреБрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛_

рдЗрд╕рд▓рд┐рдП x/sys рдмрджрд▓рдиреЗ рд╕реЗ os.OpenFile() рдХреЗ рдХреЙрд▓рд░реНрд╕ рдХреЛ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреАред рд▓реЗрдХрд┐рди рдЖрдВрддрд░рд┐рдХ/syscall Open() рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ os.OpenFile() рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред

@maruel , рдбреЙрдХрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ, рдФрд░ рд╕рдВрднрд╡рддрдГ рдХрдИ рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдиреЗ os.Rename() & .Remove() рдХреЗ рд▓рд┐рдП рдЦреЛрд▓реА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдХреНрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧреНрд░рд╣рдг рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдкреИрдХреЗрдЬ "os" рдореЗрдВ рдЙрдирдХреЗ рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА __рдкрдВрджреНрд░рд╣ рдЙрд▓реНрд▓реЗрдЦ__ рдХрд╛ рд╣реИ рдЕрдиреНрдп рд╡рд┐рдВрдбреЛрдЬрд╝ рд╡реНрдпрд╡рд╣рд╛рд░ред

рдХреЛрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА go.sys рдкреИрдХреЗрдЬ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдЧреА
рд▓реЗрдХрд┐рди рдЖрдВрддрд░рд┐рдХ/syscall Open() рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ os.OpenFile() рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред

@networkimprov рдареАрдХ рд╣реИ, рдореИрдВ рдЧрд▓рдд рдзрд╛рд░рдгрд╛ рд╣реИ рдХрд┐ рдХреЗ рддрд╣рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ internal/syscall рдХреЗ vendored рд╕рдмрд╕реЗрдЯ рдерд╛ golang.org/x/sys , рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╣реА рд░рдгрдиреАрддрд┐ (рдЬреЛрдбрд╝рдиреЗ рд╣реИ internal/syscall/windows.Open )ред рдмреЗрд╢рдХ, рдпрд╣ рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЗ рддрд╣рдд рд╣реЛрдЧрд╛ рдХрд┐ рдлреНрд░реАрдЬ рдХреЗ рдХрд╛рд░рдг syscall.Open рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд╕реАрдзреЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ golang.org/x/sys/windows.Open рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рдеред

рд╣рд╛рд▓рд╛рдВрдХрд┐ syscall рдкреИрдХреЗрдЬ рдЬрдо рдЧрдпрд╛ рд╣реИ, рд╣рдо рдмрдЧреНрд╕ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдпрд╛ рдЧрдВрднреАрд░ рдХрдорд┐рдпреЛрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╣рдо рдЗрд╕реЗ рдУрдПрд╕ рдкреИрдХреЗрдЬ рдХреЗ рдмреЗрд╣рддрд░ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд▓реЛрдЧ рд╕реАрдзреЗ syscall.Open рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ x/sys/windows рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ syscall рдкреИрдХреЗрдЬ рдХрд╛ред

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд▓реЛрдЧ рд╕реАрдзреЗ syscall.Open рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ x/sys/windows рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ syscall рдкреИрдХреЗрдЬ рдХрд╛ред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА рдлреЛрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦ рд░рд╣рд╛ рд╣реИ syscall.Open рд╕реАрдзреЗ - рдпрд╣ рдХреЗрд╡рд▓ рдЪрд░реНрдЪрд╛ рдХрд╛ рд▓рдХреНрд╖реНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ underlies os.OpenFile (рддрд╛рдХрд┐ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ FILE_SHARE_DELETE рдореЗрдВ syscall.Open рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддрд╛ рд╣реИ os.OpenFile )ред

рдзрдиреНрдпрд╡рд╛рджред os рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП syscall рдкреИрдХреЗрдЬ рдХреЛ рдмрджрд▓рдирд╛ рдареАрдХ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж @ianlancetaylor рдФрд░ @havoc-ioред рдореИрдВрдиреЗ рдКрдкрд░ рдЬреЛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рд╕реНрддрд╛рд╡:

  • FILE_SHARE_DELETE (рдФрд░ рдЕрдВрддрддрдГ FILE_FLAG_DELETE_ON_CLOSE рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрдиреБрд╡рд░реНрддреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ) рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП os.OpenFile() рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдЗрд░рд╛рджреЗ рд╕реЗ syscall.Open() рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВред
  • рдХреЗрд╡рд▓-рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рдирдП рдлрд╝реНрд▓реИрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП os.OpenFile() рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред
  • POSIX рдФрд░ Windows рдХреЗ рдмреАрдЪ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЕрдВрддрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП os.OpenFile(), os.Rename() рдФрд░ os.Remove() рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред

рддреАрд╕рд░рд╛ рдмрд┐рдВрджреБ @networkimprov рдЪрд┐рдВрддрд╛ рдХрд╛ @mattn рд╕реЗ рд╕рд╣рдордд рд╣реЛрдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпреЗ рдорд╛рдорд▓реЗ рдЕрдзрд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реВрдХреНрд╖реНрдо рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд╛рдо рдмрджрд▓реЗрдВ рдФрд░ рдирд┐рдХрд╛рд▓реЗрдВ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рддреБрд░рдВрдд рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХрд┐рд╕реА рднреА рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдордВрдЬреВрд░реА рдорд┐рд▓рдиреЗ рдкрд░ рдореИрдВ рдЗрд╕рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдХреЛ рддреИрдпрд╛рд░ рд╣реВрдВред

рдпрд╣ рд╣рдореЗрдВ рдкреНрд░рддрд┐-рдХреЙрд▓ рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рдВрдбреЛрдЬрд╝-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдирдП рдУрдПрд╕ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддреЗ рд╣реИрдВред рдЦреБрд▓рд╛ рдЭрдВрдбрд╛? рдлрд┐рд░ рдзреНрд╡рдЬ рдХреЛ рд╕рднреА рдУрдПрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрд╣ рдУрдПрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИ - рдУрдПрд╕ рд╕реНрд╡рддрдВрддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ рдЙрд╕ рдЭрдВрдбреЗ рдХрд╛ рд╢рдмреНрджрд╛рд░реНрде рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдФрд░ рдЖрдкрдХреЛ рдХреБрдЫ рдирдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдЬреЛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдзреНрд╡рдЬ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЖрдк syscall рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛ рднреА рдХреЛрдб рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдЕрдиреНрдп рд╡рд┐рдВрдбреЛрдЬ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд╣реЛрдЧрд╛ред рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рд╡рд┐рд╢реЗрд╖ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдареАрдХ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рд▓реЛрдЧ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдПрд▓реЗрдХреНрд╕

@alexbrainman
рдХреГрдкрдпрд╛ рдЗрд╕реЗ рджреЗрдЦреЗрдВ

рдореИрдВрдиреЗ рджреЗрдЦрд╛ред рдореИрдВ рдЕрднреА рднреА рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдЖрдкрдХреЗ рд╕рднреА рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдЕрдиреНрдп OSes рдкрд░ рдХреИрд╕реЗ рдХрд╛рд░реНрдп рдХрд░реЗрдВрдЧреЗ? рдЕрдкрдиреЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреМрди рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗ?

рдПрд▓реЗрдХреНрд╕

рдХреЗ рд╣рд╡рд╛рд▓реЗ рд╕реЗ рдпрд╣

рдЬрдмрдХрд┐ env рдХреЗ рд▓рд┐рдП DELETE_WHEN_FREED 0 рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛

рддреЛ - рдЕрдиреНрдп рдУрдПрд╕ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░реЗрдВ:
рдПрдлрдбреА, рддреНрд░реБрдЯрд┐: = os.OpenFile (рдкрде, os.O_RDWR|os.O_CREATE|os.DELETE_WHEN_FREED, 0600)
рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рдХрд╛рд╕реНрдЯ рдХреЛ 4 . рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
рдПрдлрдбреА, рддреНрд░реБрдЯрд┐: = os.OpenFile (рдкрде, os.O_RDWR|os.O_CREATE| 4 , 0600)
рдЬрдмрдХрд┐ рдЕрдиреНрдп ( 0 )
рдПрдлрдбреА, рддреНрд░реБрдЯрд┐: = os.OpenFile (рдкрде, os.O_RDWR|os.O_CREATE| 0 , 0600)

рдЕрдиреНрдп OSes рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рд╣рдо рдирдП рдУрдПрд╕ рдкреИрдХреЗрдЬ рдХреЙрдиреНрд╕ рдпрд╛ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдкреНрд░рдпреЛрдЧ рдпреЛрдЧреНрдп рд╣реИред

c:\>go doc os
package os // import "os"

Package os provides a platform-independent interface to operating system
functionality. 
...
The os interface is intended to be uniform across all operating systems.
Features not generally available appear in the system-specific package
syscall.

рдПрд▓реЗрдХреНрд╕

рдПрд▓реЗрдХреНрд╕ рдиреЗ рдЖрдкрдХреА рдЖрдкрддреНрддрд┐ рдХрд╛ рдЬрд╡рд╛рдм рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдерд╛ https://github.com/golang/go/issues/32088#issuecomment -494157514

рдПрдХ рдкрд░реАрдХреНрд╖рдг рддреБрдЪреНрдЫ рд╣реИ

_, err := os.OpenFile(path, os.O_CREATE | syscall.FILE_SHARE_DELETE, 0);
err = os.Rename(path, path+"2")

рд╣рдо рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХреЛрдИ рдкреИрдЪ рд╕рдмрдорд┐рдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ; рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ @ianlancetaylor рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛ред

рдореИрдВрдиреЗ #32188 рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ FILE_SHARE_DELETE рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЬрд╛рдВрдЪ рдХреА, рд▓реЗрдХрд┐рди рдкрд╛рдпрд╛ рдХрд┐ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ os.Rename рдФрд░ io.ReadFile рдХреЙрд▓ рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рджрд░ рдЖрдиреБрднрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реБрдИ; рд╡реИрд╕реЗ рднреА рдПрдХ рдкреБрди: рдкреНрд░рдпрд╛рд╕ рд▓реВрдк рдХреА рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдореБрдЭреЗ рдПрдХ рдРрд╕рд╛ рдкрд░реАрдХреНрд╖рдг рджреЗрдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдЬреЛ рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдЕрдВрддрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред

рдореИрдВрдиреЗ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ FILE_SHARE_DELETE рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛
рдЕрд▓рдЧ рдврдВрдЧ рд╕реЗред
рдореИрдВ рд╢рд╛рдпрдж рдЕрдкрдиреЗ рд╡рд┐рдВрдбреЛрдЬрд╝ рдПрдирд╡реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдФрд░ рдЗрд╕реЗ рджреЗрдЦреЛ, рдЕрдЧрд░ рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛,
рд▓реЗрдХрд┐рди рдпрд╣ ~ 1.3 рдпрд╛ рддреЛ рд╣реЛрдЧрд╛ред

рд╕реЛрдо, 10 рдЬреВрди 2019 рдХреЛ 17:44 рдмрдЬреЗ, рдмреНрд░рд╛рдпрди рд╕реАред рдорд┐рд▓реНрд╕ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдореИрдВрдиреЗ FILE_SHARE_DELETE рдХреЛ #32188 . рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЬрд╛рдВрдЪ рдХреА
https://github.com/golang/go/issues/32188 , рд▓реЗрдХрд┐рди рдкрд╛рдпрд╛ рдХрд┐ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛
os.Rename рдФрд░ . рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рджрд░ рдХреЛ рдЕрдиреБрднрд╡рдЬрдиреНрдп рд░реВрдк рд╕реЗ рдХрдо рдирд╣реАрдВ рдХрд┐рдпрд╛
io.ReadFile рдХреЙрд▓; рд╡реИрд╕реЗ рднреА рдПрдХ рдкреБрди: рдкреНрд░рдпрд╛рд╕ рд▓реВрдк рдХреА рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдореБрдЭреЗ рдПрдХ рдРрд╕рд╛ рдкрд░реАрдХреНрд╖рдг рджреЗрдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдЬреЛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдЕрдВрддрд░, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ
рдЗрд╕рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╕реНрд╡рдпрдВ рд╕рдордЭреЗрдВред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/32088?email_source=notifications&email_token=ABNEY4VVIVJ2IEWQPWCWBZTPZZSETA5CNFSM4HNPNYIKYY3PNVWWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJZ71KT рдореБрджреНрджрд╛
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABNEY4STTW7U526HPO6TUHDPZZSETANCNFSM4HNPNYIA
.

@bcmills , #32188 рдкрдврд╝ рд░рд╣рд╛ рд╣реВрдВ, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЖрдк рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди _was not open_ рдлрд╝рд╛рдЗрд▓ рдкрд░ os.Rename() рд╕реЗ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджреЗрдЦ рд░рд╣реЗ рдереЗ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдПрдирдЯреАрдПрдлрдПрд╕ рдЬрд░реНрдирд▓ рдХреЛ рдкреАрдЫреЗ рдЫреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдСрдкреНрд╕ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ; рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред

Syscall.Open() рдореЗрдВ FILE_SHARE_DELETE рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЕрдиреБрд░реЛрдз os.Rename() рдХреЛ рдЦреБрд▓реА рдлрд╛рдЗрд▓реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИред рдореИрдВрдиреЗ Win7 рдкрд░ 1.12 рдХреЗ рд╕рд╛рде рдЙрд╕ рдзреНрд╡рдЬ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ; рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ "рд▓реЛрдб рдХреЗ рддрд╣рдд" рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ os.Rename() рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди fsd рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реЗ рдЦреЛрд▓реА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ os.Rename() рд╕реЗ рдХреЛрдИ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рджреЗрдЦреА рд╣реИ, рдЕрдЧрд░ рдореИрдВ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдЗрд╕рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реВрдВрдЧрд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк os.Rename() рд╕реЗ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдкрд░ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджреЗрдЦ рд░рд╣реЗ рдереЗ рдЬреЛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЦреБрд▓реА рдирд╣реАрдВ рдереА?

рд╣рд╛рдВред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред

рдЖрдиреБрднрд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЬреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ ( MoveFileEx , ReplaceFile , рдФрд░/рдпрд╛ CreateFile ) рд╡реЗ рд╣реИрдВ ERROR_ACCESS_DENIED , ERROR_SHARING_VIOLATION , рдФрд░ ERROR_FILE_NOT_FOUND ред

Syscall.Open() рдореЗрдВ FILE_SHARE_DELETE рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЕрдиреБрд░реЛрдз os.Rename() рдХреЛ рдЦреБрд▓реА рдлрд╛рдЗрд▓реЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИред рдореИрдВрдиреЗ Win7 рдкрд░ 1.12 рдХреЗ рд╕рд╛рде рдЙрд╕ рдзреНрд╡рдЬ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ; рдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред

рд╕рд╣реА; рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдореИрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╡рд░реНрддреА рдХреЙрд▓ рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ os.Rename рд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рд▓рд┐рдП io.ReadFile рдХреЗ рд╕рд╛рде рд╕рдорд╡рд░реНрддреА os.Rename рд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдПред рдореМрдЬреВрджрд╛ рд╣реИрдВрдбрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХрд▓ os.Rename рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдХрджрдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЙрд╕ рддрд░рд╣ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо POSIX rename ред

рдореБрдЭреЗ рдПрдХ рдРрд╕рд╛ рдкрд░реАрдХреНрд╖рдг рджреЗрдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдЬреЛ рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдЕрдВрддрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред

@bcmills PowerShell рдЙрджрд╛рд╣рд░рдг рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдХрд┐ Go . рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реИ

New-Item -Type Directory -Path C:\folder1
for($i=0; $i -le 1000; $i++)
{
    $temp = [System.IO.File]::Open("C:\folder1\test.txt", "Create", "ReadWrite", "Delete")
    Set-Variable -Name "file$i" -Value $temp -Force
    $TempName = "C:\folder1\test.txt." + (New-Guid).Guid
    Rename-Item -Path C:\folder1\test.txt -NewName $TempName
    Remove-Item -Path $TempName -Force
}

рдХрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╣рд╛рдБ рд╣рдЬрд╛рд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ test.txt.??? рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдлрд╝рд╛рдЗрд▓реЗрдВ C:\folder1 рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рдХрд░реАрдм PowerShell рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рддреЛ рдХреНрдпрд╛ FILE_SHARE_DELETE рдзреНрд╡рдЬ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХреЛ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ/рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ/рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрднреА рднреА рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЧрдВрддрд╡реНрдп рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдЕрджреНрд╡рд┐рддреАрдп рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдбрд┐рд╕реНрдХ рдкрд░ рддрдм рддрдХ рдореМрдЬреВрдж рд░рд╣реЗрдВрдЧреЗ рдЬрдм рддрдХ рд╣реИрдВрдбрд▓ рдЦреБрд▓реЗ рд╣реИрдВред

рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ "рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдирд╛рдо рдмрджрд▓реЗрдВ" рдЕрд╕рдВрднрд╡ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдорд┐рд▓рдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВред

рдкреЙрдЬрд╝рд┐рдХреНрд╕:

рдлрд╝рд╛рдЗрд▓ "рдлрд╝рд╛рдЗрд▓ рдирд╛рдо" рдмрдирд╛рдПрдБ
"рдлрд╝рд╛рдЗрд▓ рдирд╛рдо" рд╕реЗ рдкрдврд╝реЗрдВ/рд▓рд┐рдЦреЗрдВ
"рдлрд╝рд╛рдЗрд▓ рдирд╛рдо" рд╣рдЯрд╛рдПрдВ

рдлрд╝рд╛рдЗрд▓ "рдлрд╝рд╛рдЗрд▓ рдирд╛рдо" рдмрдирд╛рдПрдБ
...
"рдлрд╝рд╛рдЗрд▓ рдирд╛рдо" рд╣рдЯрд╛рдПрдВ

рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрдорд╛рдг рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рднрд┐рдиреНрди fd рд╣реЛрдЧрд╛ред

рдЦрд┐рдбрд╝рдХрд┐рдпрд╛рдБ:
рдлрд╝рд╛рдЗрд▓ "рдлрд╝рд╛рдЗрд▓ рдирд╛рдо" рдмрдирд╛рдПрдБ
"рдлрд╝рд╛рдЗрд▓ рдирд╛рдо" рд╕реЗ рдкрдврд╝реЗрдВ/рд▓рд┐рдЦреЗрдВ
"рдлрд╝рд╛рдЗрд▓ рдирд╛рдо" рд╣рдЯрд╛рдПрдВ

рдлрд╝рд╛рдЗрд▓ "рдлрд╝рд╛рдЗрд▓ рдирд╛рдо" рдмрдирд╛рдПрдВ - рдмреВрдо, рдЙрд▓реНрд▓рдВрдШрди рд╕рд╛рдЭрд╛ рдХрд░рдирд╛

рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ...

рддрдм FILE_SHARE_DELETE рдХреНрдпрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?
рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЦреБрд▓реЗ рд╣реЛрдиреЗ рдкрд░ рдбрд┐рдлрд░реНрдб рдбрд┐рд▓реАрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред

рдмрд╕, рдЗрддрдирд╛ рд╣реАред

рд╕реЛрдо, 10 рдЬреВрди 2019 рдХреЛ 19:32 рдмрдЬреЗ, рдУрд▓реА рдЬрдирд╛рддреБрдЗрдиреЗрди рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

рдореБрдЭреЗ рдПрдХ рдРрд╕рд╛ рдкрд░реАрдХреНрд╖рдг рджреЗрдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдЬреЛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рджреЗрдЦрдиреЗ рдпреЛрдЧреНрдп рдЕрдВрддрд░, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рд╣реВрдВ
рдЗрд╕рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рд╕реНрд╡рдпрдВ рд╕рдордЭреЗрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ https://github.com/bcmills PowerShell рдЙрджрд╛рд╣рд░рдг
рдЧреЛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ

рдирдпрд╛-рдЖрдЗрдЯрдо-рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛-рдкрде C:folder1for($i=0; $i -le 1000; $i++)
{
$temp = [System.IO.File]::Open("C:folder1test.txt", "Create", "ReadWrite", "Delete")
рд╕реЗрдЯ-рд╡реЗрд░рд┐рдПрдмрд▓-рдирд╛рдо "рдлрд╝рд╛рдЗрд▓$i" -рдореВрд▓реНрдп $temp-Force
$TempName = "рд╕реА:folder1test.txtред" + (рдирдпрд╛-рдЧрд╛рдЗрдб)редрдЧрд╛рдЗрдб
рдирд╛рдо рдмрджрд▓реЗрдВ-рдЖрдЗрдЯрдо-рдкрде C:folder1test.txt-NewName $TempName
рдирд┐рдХрд╛рд▓реЗрдВ-рдЖрдЗрдЯрдо-рдкрде $TempName-Force
}

рдЙрд╕рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдЬрд╛рд░ test.txt рд╣реЛрдВрдЧреЗред??? рдХреЗ рддрд╣рдд рдлрд╝рд╛рдЗрд▓реЗрдВ
рд╕реА: рдлрд╝реЛрд▓реНрдбрд░ 1 рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рдкрд╛рд╡рд░рд╢реЗрд▓ рдмрдВрдж рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╡реЗ рдлрд╛рдЗрд▓реЗрдВ рд╣рдЯрд╛ рджреА рдЬрд╛рдПрдВрдЧреАред

рддреЛ рдХреНрдпрд╛ FILE_SHARE_DELETE рдзреНрд╡рдЬ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдЖрдкрдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
рдЦреБрд▓реА рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ/рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ/рд╣рдЯрд╛рдПрдВ рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрднреА рднреА рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЧрдВрддрд╡реНрдп
рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдЕрджреНрд╡рд┐рддреАрдп рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдбрд┐рд╕реНрдХ рдкрд░ рддрдм рддрдХ рдореМрдЬреВрдж рд░рд╣реЗрдВрдЧреЗ рдЬрдм рддрдХ рд╣реИрдВрдбрд▓
рдЦреБрд▓рд╛ рд╣реИред

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/32088?email_source=notifications&email_token=ABNEY4WSTWIUVNVHLYMBFY3PZZ62DA5CNFSM4HNPNYIKYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXH248GORT рд╕рдорд╕реНрдпрд╛
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABNEY4VS5XF3EXB6QPBWVQ3PZZ62DANCNFSM4HNPNYIA
.

io рдХреЛ рдХреЙрд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред рдУрдПрд╕ рдХреЗ рд╕рд╛рде рд░реАрдбрдлрд╛рдЗрд▓ рд╕рдорд╡рд░реНрддреАред рд╕рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╛рдо рдмрджрд▓реЗрдВ

@bcmills рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рд╣рдореЗрд╢рд╛

рдкрд░реАрдХреНрд╖рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЙрд╕ рдкрд╣рд▓реВ рдХреЛ Windows syscall.Open() рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдПрдХ рдмрдЧ рдорд┐рд▓рд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рдФрд░ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдпрд╣ рдареАрдХ рд╣реЛ :-( рддреЛ рд╣рд╛рдБ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреИрдЪ рдХрд░реЗрдВред

рдЯреАрдПрд▓рдбреАрдЖрд░:
syscal_windows.go рдореЗрдВ рдорд╛рдореВрд▓реА рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА:
рддреЛ, рдпрд╣рд╛рдБ рдореИрдВрдиреЗ рдЬреЛ рдХрд┐рдпрд╛ рд╣реИ, рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рдЬреЛрдЦрд┐рдо рдирд╣реАрдВ (рдЖрдИрдПрдордУ)

  1. рдЯреНрд╡рд┐рдХ syscal_windows.go
func Open(path string, mode int, perm uint32) (fd Handle, err error) {

sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE | (mode & FILE_SHARE_DELETE))

рдЬреЛрдбрд╝ рд╣реИ: "| (рдореЛрдб рдФрд░ FILE_SHARE_DELETE)"
рдЕрдЧрд░ рдбреЗрд╡рд▓рдкрд░ рдореЛрдб рдФрд░ 4 рд╕реЗрдЯ рдирд╣реАрдВ рднреЗрдЬреЗрдЧрд╛ (рд╡рд╣ рдХреНрдпреЛрдВ - рдпрд╣ рдкрд╣рд▓реЗ рдХрднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рдерд╛ ...) - рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдХреЛрдб

os.OpenFile(filename,os.O_RDWR|os.O_CREATE, 0600)

рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛ рдЬреИрд╕рд╛ рд╡рд╣ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд╣рд▓реЗ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЬреЛ рдХрд░реЗрдВрдЧреЗ

os.OpenFile(filename,os.O_RDWR|os.O_CREATE  | 4 , 0600)

рдмрджрд▓рд╛рд╡ рдХреЛ "рдорд╣рд╕реВрд╕" рдХрд░реЗрдВрдЧреЗ

  1. рдХреЛрдб рдЪрд▓рд╛рдпрд╛
package main

import (
    "fmt"
    "os"
)

func main() {
    filename := "./myfile"
    if f ,err := os.OpenFile(filename,os.O_RDWR|os.O_CREATE|4, 0600);err!=nil{
        fmt.Printf("Open file %s error : %s" , filename, err.Error())
    } else if _,err:= f.WriteString("bla bla") ;err!=nil{
        fmt.Printf("writing to %s returned error : %s" , filename, err.Error())
    } else if err := os.Remove(filename);err!=nil{
        fmt.Printf("removing %s returned error : %s" , filename, err.Error())
    }
}

рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛

  1. |4 рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рдЪрд▓рд╛рдпрд╛ рдФрд░ рдпрд╣ рд╡рд┐рдлрд▓ рд░рд╣рд╛
  2. рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЬреЛрдбрд╝ рдХреЗ рд╕рд╛рде рдХреЛрдб рдЪрд▓рд╛рдпрд╛:
package main

import (
    "fmt"
    "os"
)

func main() {
    filename := "./myfile"
    if f ,err := os.OpenFile(filename,os.O_RDWR|os.O_CREATE|4, 0600);err!=nil{
        fmt.Printf("Open file %s error : %s" , filename, err.Error())
    } else if _,err:= f.WriteString("bla bla") ;err!=nil{
        fmt.Printf("writing to %s returned error : %s" , filename, err.Error())
    } else if err := os.Remove(filename);err!=nil{
        fmt.Printf("removing %s returned error : %s" , filename, err.Error())
    } else if secondF ,err := os.OpenFile(filename,os.O_RDWR|os.O_CREATE|4, 0600);err!=nil{
        fmt.Printf("reOpen file %s error : %s" , filename, err.Error())
    } else {
        secondF.Close()
    }
}

рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рджреВрд╕рд░реЗ рдкрд░ рд╡рд┐рдлрд▓ рд░рд╣рд╛F
рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ - "рдкрд░реАрдХреНрд╖рдг рд▓реЛрдб" рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рд╕реНрдердЧрд┐рдд рдкрд░ рдХреЛрдИ рд╕рдорд╡рд░реНрддреА рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдирд┐рдХрд╛рд▓реЗрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рдореМрдЬреВрджрд╛ рдХреЛрдб рд╕реЗ рд╕рдордЭреМрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛, syscal_windows рдореЗрдВ рдЗрд╕ рдЖрдзреА рд▓рд╛рдЗрди рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рд╣рдЯрд╛рдиреЗ рдХреЛ рдЯрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ

рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ (рдмреЛрд▓реНрдб рдореЗрдВ):
syscal_windows.go:
рд╢реЗрдпрд░рдореЛрдб: = uint32 (FILE_SHARE_READ | FILE_SHARE_WRITE | (рдореЛрдб рдФрд░ FILE_SHARE_DELETE) )

рдореИрдВрдиреЗ #32188 рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ FILE_SHARE_DELETE рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЬрд╛рдВрдЪ рдХреА, рд▓реЗрдХрд┐рди рдкрд╛рдпрд╛ рдХрд┐ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ os.Rename рдФрд░ io.ReadFile рдХреЙрд▓ рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рджрд░ рдЖрдиреБрднрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХрдо рдирд╣реАрдВ рд╣реБрдИ; рд╡реИрд╕реЗ рднреА рдПрдХ рдкреБрди: рдкреНрд░рдпрд╛рд╕ рд▓реВрдк рдХреА рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдореБрдЭреЗ рдПрдХ рдРрд╕рд╛ рдкрд░реАрдХреНрд╖рдг рджреЗрдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреА рдЬреЛ рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдЕрдВрддрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рд╕рдордЭрддрд╛ред

@bcmills рдЕрдм рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП https://github.com/olljanat/go/commit/3828f1a5d0ebb69b4c459d5243799ded36ac1ee8 рд╕реЗ рдпреВрдирд┐рдЯ/рд░рд┐рдЧреНрд░реЗрд╢рди рдкрд░реАрдХреНрд╖рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдпрд╣ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ The process cannot access the file because it is being used by another process. рддреНрд░реБрдЯрд┐ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ рдФрд░ FILE_SHARE_DELETE рдмрд╛рдж рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ

рдзреНрдпрд╛рди рджреЗрдВ! рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЖрдкрдХреЛ рдЕрднреА рднреА рдЙрд╕ рдЪрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд▓реЙрдЧ example.log.1 рдлрд╝рд╛рдЗрд▓ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ/рдЕрджреНрд╡рд┐рддреАрдп рдирд╛рдо рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рдХреНрдпреЛрдВ example.log рд╕реЗ example.log.1 рдирд╛рдо рдмрджрд▓рдирд╛ Access is denied. рддреНрд░реБрдЯрд┐ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ FILE_SHARE_DELETE рдзреНрд╡рдЬ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдкрд░ рднреАред рд╡рд╣ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреАрдЬрд╝ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдзреНрдпрд╛рди рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

/рд╕реАрд╕реА @jhowardmsft @jterry75 @jstarks @ddebroy FYI рдХрд░реЗрдВ; рдЖрдкрдХреЛ рдЗрд╕рдореЗрдВ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛ рд╕рдХрддреА рд╣реИред

@kevpar - FYI рдХрд░реЗрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рднреА рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ

рдпрджрд┐ рдереНрд░реЗрдб рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рд╡реНрдпрдХреНрддрд┐ os.OpenFile() рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬрд╝-рдУрдирд▓реА рдлрд╝реНрд▓реИрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рдмрдирд╛рдо рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░рдг (рдЬреИрд╕реЗ рдореМрдЬреВрджрд╛ рдХреЛрдб рдЯреВрдЯрд╛ рд╣реБрдЖ) рдЖрд╡рд╛рдЬ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдкрд╛рдЗрдк рдЕрдк рдХрд░реЗрдВ!

@networkimprov IMO рдЗрд╕реЗ рд╡рд┐рдВрдбреЛрдЬрд╝-рдУрдирд▓реА рдлреНрд▓реИрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдХреБрдЫ рдЕрдиреНрдп рд╡рд┐рдВрдбреЛрдЬрд╝ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪреАрдЬреЛрдВ рдХреЛ рднреА рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдореЗрд░реЗ рд▓реЙрдЧ рд░реЛрдЯреЗрдЯ рдЙрджрд╛рд╣рд░рдг рдкрд░ред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдБ рдХрд┐ Microsoft рдХреЗ рдХреБрдЫ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рджреЗрдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд░рдЦрддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВ рдиреЗ рдЗрд╕рдХрд╛ рдирдпрд╛ рд╕рдорд╛рдзрд╛рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ? рдХреЛрдИ рд╕реНрд╡рдпрдорд╕реЗрд╡рдХ?

@olljanat
рдпрджрд┐ рдпрд╣ рдПрдХ рдзреНрд╡рдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдареАрдХ рд╣реИ, рддреЛ рдлрд┐рдХреНрд╕ рдПрдХ рд▓рд╛рдЗрдирд░ рд╣реИ, рдХреГрдкрдпрд╛ рдкрдврд╝реЗрдВ:
https://github.com/golang/go/issues/32088#issuecomment -500562223

рдореИрдВ рдпрд╣рд╛рдВ рд╡рд┐рдВрдбреЛрдЬ рдЯреАрдо рдХреЗ рдирдЬрд░рд┐рдП рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛... рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрд╢рд╛ FILE_SHARE_DELETE рд╕реЗрдЯ рдХрд░реЗрдВ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рдХрд▓реНрдк рдХреЗред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ/рд╕реЗ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓рд┐рдирдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕реБрд╕рдВрдЧрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВрдЧреЗ, рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ !FILE_SHARE_DELETE рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдо рдХреЗ рдЕрдкрд╡рд╛рдж рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХреНрдпреЛрдВ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред

рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдиреЛрдЯ, @mattn рдХреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╡рд┐рдкрд░реАрдд: рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдордиреЗ "POSIX" рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DeleteFile (NTFS рдкрд░) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдлрд╛рдЗрд▓ рдХреЛ рд╕рднреА рдУрдкрди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдиреЗрдорд╕реНрдкреЗрд╕ рд╕реЗ рддреБрд░рдВрдд рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓ред рдпрд╣ рдЕрднреА рднреА FILE_SHARE_DELETE рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдЕрдиреНрдпрдерд╛ POSIX рдЕрдирд▓рд┐рдВрдХ рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ WSL тАЛтАЛрдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝реА рдЧрдИ рдереА рдФрд░ рдЗрд╕реЗ Windows рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдорд╛рдирд╛ рдЧрдпрд╛ рдерд╛ред

рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрджрд┐ рдЖрдк рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдореИрдЯрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рдбреЗрд▓, рдбреАрдЖрдИрдЖрд░, рдЖрджрд┐ рдХрд╛ рдЕрдиреБрдХреНрд░рдо рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдирд╛рдорд╕реНрдерд╛рди рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдЧрд╛рдпрдм рд╣реЛрддреЗ рджреЗрдЦреЗрдВрдЧреЗ, рди рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдмрд╛рджред рдмрд┐рд▓реНрдХреБрд▓ рд▓рд┐рдирдХреНрд╕ рдХреА рддрд░рд╣ред

рдЗрд╕рд▓рд┐рдП рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рд╣реА, рдЗрд╕рдХреЗ рдХрд╛рдлреА рдмрдбрд╝реЗ рдПрдкрдХреЙрдореНрдкреИрдЯ рдЬреЛрдЦрд┐рдо рдХреЗ рд╕рд╛рде, рд╣рдо рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рдЧреИрд░-рд╡рд┐рдВрдбреЛрдЬ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЫреЛрдЯреЗ рдмрджрд▓рд╛рд╡ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧреЛ рдХреЛ рднреА рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред

@jstarks , рдореБрдЭреЗ рд╕рд╣реА рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдПрдХ рдЯрди рдЧрд░реНрдореА рд▓реА рд╣реИред

рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╡рд░реНрддрдорд╛рди рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВ fsd рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ред

@ianlancetaylor рдХреНрдпрд╛ рдЖрдк рд╕рд╣рдордд рд╣реИрдВ?

рдЪреВрдВрдХрд┐ CreateFile рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреЛрдИ рдореВрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдРрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдЙрдирдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рдирд╣реАрдВ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдкрд╛рдпрдерди рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧреЛ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рдорд╛рди рд╣реИред рдФрд░ рдореИрдВрдиреЗ рдХрднреА рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдХреЗ рдкрд╛рд╕ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИ рдЬреЛ рдЦреБрд▓реА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдЧрдВрднреАрд░ рд░рд╛рдп рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд┐рдХрд▓реНрдк рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред рд╣рдореЗрдВ рдпрд╛ рддреЛ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП (рдФрд░ рд╢рд╛рдпрдж рдЕрдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдЬреЛрдбрд╝реЗрдВ) рдпрд╛ рд╣рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП (рдФрд░ рд╢рд╛рдпрдж рдореВрд▓, рд╡рд░реНрддрдорд╛рди, рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рдЬреЛрдбрд╝реЗрдВ)ред

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рдкреВрдЫрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓рдиреЗ рд╕реЗ рдпреВрдирд┐рдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ рд╡рд┐рдВрдбреЛрдЬ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред

рдЬреИрд╕рд╛ рдХрд┐ @mattn рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрдЫрдиреЗ рд▓рд╛рдпрдХ рднреА рд╣реИ рдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИрдВред

рдпрджрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рднреА рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдПрдХ os.OpenFile() рдзреНрд╡рдЬ рдФрд░ рд╕рдВрдХреНрд░рдордгрдХрд╛рд▓реАрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд┐рдХрд▓реНрдк рджреЛрдиреЛрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

IPv6 рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдореИрдВрдиреЗ рдЬрд╛рдБрдЪ рдХреА рдереАред

рдкреНрд░рднрд╛рд╡ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдЗрд╕реЗ рдЯрд┐рдк рдкрд░ рдмрджрд▓рдирд╛ (рдФрд░ рдмреНрд▓реЙрдЧ рдкрд░ рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛?) рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдВрдХ рдкрд╛рда рдореЗрдВ рдкрд╛рдпрдерди рдФрд░ рдПрд░рд▓рд╛рдВрдЧ рджреЛрдиреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
Erlang рдиреЗ рдЗрд╕реЗ рдЫрд╣ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛ рджрд┐рдпрд╛ рдерд╛: erlang/ otp@0e02f48
MSVC рд░рдирдЯрд╛рдЗрдо рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдкрд╛рдпрдерди рдЪрд╛рд╣рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛: https://bugs.python.org/issue15244

рдореИрдВ рдпрд╣рд╛рдВ рд╡рд┐рдВрдбреЛрдЬ рдЯреАрдо рдХреЗ рдирдЬрд░рд┐рдП рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛... рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдореЗрд╢рд╛ FILE_SHARE_DELETE рд╕реЗрдЯ рдХрд░реЗрдВ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рдХрд▓реНрдк рдХреЗред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ/рд╕реЗ рдкреЛрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓рд┐рдирдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕реБрд╕рдВрдЧрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрдВрдЧреЗ, рдФрд░ рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ !FILE_SHARE_DELETE рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рдпрдо рдХреЗ рдЕрдкрд╡рд╛рдж рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХреНрдпреЛрдВ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред

рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдордиреЗ "POSIX" рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DeleteFile (NTFS рдкрд░) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдлрд╛рдЗрд▓ рдХреЗ рд╕рднреА рдЦреБрд▓реЗ рд╣реИрдВрдбрд▓ рдХреЗ рдмрдВрдж рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдлрд╝рд╛рдЗрд▓ рдХреЛ рдиреЗрдорд╕реНрдкреЗрд╕ рд╕реЗ рддреБрд░рдВрдд рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЕрднреА рднреА FILE_SHARE_DELETE рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдЕрдиреНрдпрдерд╛ POSIX рдЕрдирд▓рд┐рдВрдХ рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ WSL тАЛтАЛрдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝реА рдЧрдИ рдереА рдФрд░ рдЗрд╕реЗ Windows рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдорд╛рдирд╛ рдЧрдпрд╛ рдерд╛ред

@jstarks рдЬреЛ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рд╡рд┐рд╡рд░рдг рд╣реИред рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рдЙрдореНрдореАрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Microsoft рдкреБрд░рд╛рдиреЗ OS рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рднреА рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдП? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рд╕рд░реНрд╡рд░ 2019 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдирд╡реАрдирддрдо рд╣реИ, рдЕрднреА рдЬрд╛рд░реА рдПрд▓рдЯреАрдПрд╕рд╕реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ рдЬреЛ рдЕрднреА рднреА рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдорд░реНрдерд┐рдд рд░рд╣реЗрдЧрд╛ред

рдЬреИрд╕реЗ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ FILE_SHARE_DELETE рдХреЛ рдЧреЛ рдкрд░ рднреА рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ред

рдЬрд╛рд╡рд╛, рд╕реА #, рдФрд░ рдЕрдиреНрдп рд╕рднреА рдкреНрд░рдореБрдЦ рднрд╛рд╖рд╛рдПрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдУрдПрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдУрдПрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдХреЛ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╡рд╣ рдЬреЛрдЦрд┐рдо рдЙрдард╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рдЙрдиреНрд╣реЛрдВрдиреЗ DeleteFile рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╢реЗрдпрд░ рдбрд┐рд▓реАрдЯ рдлрд╛рдЗрд▓ рдмрдирд╛рдирд╛/рдЦреЛрд▓рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдлрд╝рд╛рдЗрд▓ рдореЛрдб рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдореЗрдВ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗ рд╕рдХрддрд╛ рд╣реВрдВред рд╣рдбреЛрдк рдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рд╕рд╛рдЭрд╛ рдбрд┐рд▓реАрдЯ рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓ рдпрд╛ рд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдПрдирдЖрдИ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

https://github.com/apache/hadoop/search?q=getShareDeleteFileInputStream&unscoped_q=getShareDeleteFileInputStream

@jstarks

рдХрд╣рддреЗ рд╕рдордп

рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдордиреЗ "POSIX" рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DeleteFile (NTFS рдкрд░) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдиреЗрдорд╕реНрдкреЗрд╕ рд╕реЗ рддреБрд░рдВрдд рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдкрдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЗрд╡рд▓ fd рдФрд░ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣рддреА рд╣реИ:

package main

import (
    "fmt"
    "os"
)

func main() {
    filename := "./myfile"
    if f ,err := os.OpenFile(filename,os.O_RDWR|os.O_CREATE|4, 0600);err!=nil{
        fmt.Printf("Open file %s error : %s" , filename, err.Error())
    } else if _,err:= f.WriteString("bla bla") ;err!=nil{
        fmt.Printf("writing to %s returned error : %s" , filename, err.Error())
    } else if err := os.Remove(filename);err!=nil{
        fmt.Printf("removing %s returned error : %s" , filename, err.Error())
    } else if secondF ,err := os.OpenFile(filename,os.O_RDWR|os.O_CREATE|4, 0600);err!=nil{
        fmt.Printf("reOpen file %s error : %s" , filename, err.Error())
    } else {
        secondF.Close()
    }
}

рдкрд░ рдЕрд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛

} else if secondF ,err := os.OpenFile(filename,os.O_RDWR|os.O_CREATE|4, 0600);err!=nil{

рд╕реБрдЭрд╛рдП рдЧрдП рдлрд┐рдХреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж?

рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ!

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рд╕рдВрдмрдВрдз рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рдкреВрдЫрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓рдиреЗ рд╕реЗ рдпреВрдирд┐рдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдПрдХ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдХреНрдпрд╛ рдпрд╣ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ рд╡рд┐рдВрдбреЛрдЬ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛ред рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред

рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдХреЛрдИ problem to be fixed рдпреВрдирд┐рдХреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рд╡рд┐рдВрдбреЛрдЬрд╝ рдпреВрдирд┐рдХреНрд╕ рд╕реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдЦреЛрд▓реА рдЧрдИ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗрд╕ рд╕рдВрд╡реЗрджрдирд╢реАрд▓рддрд╛ рдХреЗ рд╕рдорд╛рди рд╣реИ: рдпреВрдирд┐рдХреНрд╕ рдХреЗрд╕ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИ, рдФрд░ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗрд╕ рдЕрд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реИред рджреЛрдиреЛрдВ рдорддрднреЗрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдФрд░, рдЬрдмрдХрд┐ рдЬреЙрди рдиреЗ рдЖрд╢реНрд╡рд╛рд╕рди рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдЪреАрдЬреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдореИрдВ рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдмрджрд▓рд╛рд╡ рдпрд╣рд╛рдВ рди рд╣реЛред рдФрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдВрдбреЛрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрднреА рднреА рд╡рд┐рдВрдбреЛрдЬ 7 рдФрд░ рдЕрдиреНрдп рд╕рднреА рд╡рд┐рдВрдбреЛрдЬ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЬреЙрди рдХреНрдпрд╛ рдЖрдк рд╡рд┐рдВрдбреЛрдЬ 7 рдХреЛ рднреА рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВрдЧреЗ?

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреЛ рдмрджрд▓рд╛рд╡ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╣рдо рдЧреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рднреА рдЧреИрд░-рдЧреЛ рдбреЗрд╡рд▓рдкрд░ рд░рд╣реЗрдВрдЧреЗред рддреЛ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреЛ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред

рд╕рд╛рде рд╣реА, FILE_SHARE_DELETE рдХреА рдЕрдкрдиреА рдкрд╣реЗрд▓рд┐рдпрд╛рдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, https://bugs.python.org/issue15244 рдкрдврд╝рдирд╛

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдпреВрдирд┐рдХреНрд╕ рдХреЗ рд╕рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рдирд╣реАрдВ рд╣реИред

рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рдЙрд╕реА рдирд╛рдо рдХреА рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╣реИрдВрдбрд▓ рдмрдВрдж рди рд╣реЛ рдЬрд╛рдПред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрд╣реАрдВ рдФрд░ (рдЬреИрд╕реЗ рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА) рд▓реЗ рдЬрд╛рдХрд░ рдЙрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╢рд╛рдпрдж рдРрд╕реЗ рдФрд░ рднреА рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗред рд╣рдордиреЗ FILE_SHARE_DELETE рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ FILE_SHARE_DELETE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Go libs рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдирдХреЗ рдЯреВрдЯреЗ рд╣реБрдП рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ?

рдЬреИрд╕рд╛ рдХрд┐ @mattn рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкреВрдЫрдиреЗ рд▓рд╛рдпрдХ рднреА рд╣реИ рдХрд┐ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИрдВред

рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдорд┐рдВрдЧрд╡ рд╕реА рдХреА рдЬрд╛рдБрдЪ рдХреА - рдпрд╣ рдЧреЛ рдХреА рддрд░рд╣ рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ fopen рдХреЗ рд╕рд╛рде рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рддрдм рддрдХ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рдЬрдм рддрдХ fclose рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрдЧрд╛ рдпрджрд┐ рдХреЛрдИ Microsoft рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг (C, C++, C#, VB рдФрд░ рдЕрдиреНрдп) рднрд┐рдиреНрди рд╣реИрдВред

рдФрд░ рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреИрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЦреЛрд▓реА рдЧрдИ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдпрд╣ рд╡реИрдз рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рд╣рдореЗрдВ рдЖрдЧреЗ рдЬрд╛рдХрд░ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реИред

рдПрд▓реЗрдХреНрд╕

7 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ:
https://sourceforge.net/p/mingw-w64/code/HEAD/tree/stable/v3.x/mingw-w64-headers/include/ntdef.h#l858

рдЕрдм рддрдХ, рдХрд┐рд╕реА рдиреЗ рднреА рдЧреЛ рдРрдк рдХреЗ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рдХрд┐рдП рд╣реИрдВ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рдВрдбреЛрдЬ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдордиреЗ рдЧреЛ рдРрдкреНрд╕ рдХреЗ рдХрдо рд╕реЗ рдХрдо 4 рдорд╛рдорд▓реЗ рд╕реБрдиреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдПред

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, os.Remove() рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
os.Rename(path, unique_path); os.Remove(unique_path)

рдЕрдм рддрдХ, рдХрд┐рд╕реА рдиреЗ рднреА рдЧреЛ рдРрдк рдХреЗ рдРрд╕реЗ рдорд╛рдорд▓реЗ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рдХрд┐рдП рд╣реИрдВ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╡рд┐рдВрдбреЛрдЬ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред

рдЗрди рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╣ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЧреЛ рдмрдЧреНрд╕ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдЖрдкрдХреЛ рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдЙрдореНрдореАрдж рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдЧреЛ рдЗрд╢реНрдпреВ рд▓рд┐рд╕реНрдЯ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдХреБрдЫ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рдЙрдирдХреЗ рдкрд╛рд╕ рдЬреАрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рд╣реИред рдпрд╣ рд╣рдо рдкрд░ рд╣реИ рдХрд┐ рд╣рдо рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рди рддреЛрдбрд╝реЗрдВ рдЬрд┐рдирдХрд╛ рд╡реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдПрд▓реЗрдХреНрд╕

рдПрд▓реЗрдХреНрд╕, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдк рдЕрдиреБрдирдп-рд╡рд┐рдирдп рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдлрд┐рд░ рдореБрдЭреЗ рдЖрдЧреЗ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░рд╛рд╕реНрддреЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд▓реЛрдЧ рдЧреЛ рдореЗрдВ рдкреЛрд░реНрдЯреЗрдмрд▓ рдХреЛрдб рд▓рд┐рдЦ рд╕рдХреЗрдВ:

  1. Open рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдСрдкреНрдЯ-рдЗрди рдлрд╝реНрд▓реИрдЧ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП FILE_SHARE_DELETE рдФрд░ рдЕрдиреНрдп OSes рдХреЗ рд▓рд┐рдП рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдХрд┐рд╕реА рдХреЛ рднреА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ POSIX рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╣рд░ рдЬрдЧрд╣ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ; рдпрд╛,
  2. рдПрдХ рдирдпрд╛ рдЧреЛ рдкреИрдХреЗрдЬ posix (рдХрд╣реАрдВ рд░реЗрдкреЛ рдореЗрдВ) рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде, Open , рдЬреЛ CreateFile рдХреЛ FILE_SHARE_DELETE рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдиреНрдпрдерд╛ os.Open рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЧреИрд░-рд╡рд┐рдВрдбреЛрдЬ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░, рдпрд╣ рд╕реАрдзреЗ os.Open рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдлрд┐рд░ рд╣рдо рд╣рд░ рдЬрдЧрд╣ os.Open рдмрдЬрд╛рдп posix.Open рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП POSIX рд╢рдмреНрджрд╛рд░реНрде рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдВрдЧреЗред

рдЗрди рджреЛрдиреЛрдВ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдкреЙрдЬрд╝рд┐рдХреНрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдпреЗ рдПрдХ-рдСрдл рдХреНрд░рд┐рдПрдЯрдлрд╛рдЗрд▓ рд░реИрдкрд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рд╣рдордиреЗ рдЕрднреА рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛)ред

рдПрд▓реЗрдХреНрд╕, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдк рдЕрдиреБрдирдп-рд╡рд┐рдирдп рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдореИрдВ рд░рд╛рдЬреА рдирд╣реАрдВ рд╣реВрдВред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдореБрдЭреЗ рдордирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЖрдкрдХреЛ рдЧреЛ рдЯреАрдо рдХреЛ рдордирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╡реЗ рдирд┐рд░реНрдгрдп рд▓реЗ рд░рд╣реЗ рд╣реЛрдВрдЧреЗред

  1. Open рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдСрдкреНрдЯ-рдЗрди рдлрд╝реНрд▓реИрдЧ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП FILE_SHARE_DELETE рдФрд░ рдЕрдиреНрдп OSes рдХреЗ рд▓рд┐рдП рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдХрд┐рд╕реА рдХреЛ рднреА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ POSIX рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╣рд░ рдЬрдЧрд╣ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ; рдпрд╛,

рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рднреА рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдУрдПрд╕ рдкреИрдХреЗрдЬ рдХрд┐рд╕реА рднреА рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред OS рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреБрдЫ рднреА syscall, рдпрд╛ golang.org/x/sys/windows, рдпрд╛ рдЬреЛ рднреА рдЕрдиреНрдп рдкреИрдХреЗрдЬ рд╣рдореЗрдВ рдкрд╕рдВрдж рд╣реЛ, рдЙрд╕рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рджреВрд╕рд░рд╛, рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ FILE_SHARE_DELETE рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛, рднрд▓реЗ рд╣реА рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП, рдЕрдЧрд░ рдореИрдВ рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ FILE_SHARE_DELETE рдлрд╝рд╛рдЗрд▓ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛, рдХрд┐ рдореЗрд░рд╛ рдХреБрдЫ рдХреЛрдб FILE_SHARE_DELETE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ? рдореБрдЭреЗ рдкреИрдХреЗрдЬ рд╕реНрд░реЛрдд рдХреЛрдб grep рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╛ рдкреИрдХреЗрдЬ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЪреЗрддрд╛рд╡рдиреА рджреЗрдиреА рд╣реЛрдЧреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдЧрд░ рдХреБрдЫ рдкреИрдХреЗрдЬ рд▓реЗрдЦрдХ рд╕реАрдзреЗ syscall.CreateFile рдХрд╛ рдЙрдкрдпреЛрдЧ FILE_SHARE_DELETE рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЕрдЧрд░ рдУрдПрд╕ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП FILE_SHARE_DELETE рдзрдиреНрдп рд╣реИ, рддреЛ рдпрд╣ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ, рд▓рд┐рдирдХреНрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдЬреЛ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рд▓рд┐рдирдХреНрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдкреЛрд░реНрдЯ рдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП "рдЖрд╕рд╛рди" рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред

рддреАрд╕рд░рд╛, рд╣рдореЗрдВ FILE_SHARE_DELETE рдзреНрд╡рдЬ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдХреЗрд╡рд▓ POSIX рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗред рд╣рдореЗрдВ рдпрд╣ рдмрддрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЭрдВрдбрд╛ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВред рдпрд╣ рднреА рдпрд╛рдж рд░рдЦреЗрдВ:

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдпреВрдирд┐рдХреНрд╕ рдХреЗ рд╕рдорд╛рди рд╢рдмреНрджрд╛рд░реНрде рдирд╣реАрдВ рд╣реИред

рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдк рдЙрд╕реА рдирд╛рдо рдХреА рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╣реИрдВрдбрд▓ рдмрдВрдж рди рд╣реЛ рдЬрд╛рдПред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрд╣реАрдВ рдФрд░ (рдЬреИрд╕реЗ рд░реВрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА) рд▓реЗ рдЬрд╛рдХрд░ рдЙрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред

https://github.com/golang/go/issues/32088#issuecomment -504321027 рд╕реЗред рд╣рдореЗрдВ рдЙрд╕рдХрд╛ рднреА рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЕрдиреНрдп рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛ FILE_SHARE_DELETE рдзреНрд╡рдЬ рд▓рд╛рддреА рд╣реИред

рдЪреМрдерд╛, рд╣рдореЗрдВ FILE_SHARE_DELETE рд▓рд┐рдП рдирдП рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдиреЗ рд╣реЛрдВрдЧреЗред рдпреЗ рдкрд░реАрдХреНрд╖рдг рдХреНрдпрд╛ рд╣реЛрдВрдЧреЗ? рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдо рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ FILE_SHARE_DELETE рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ? рдЕрдЧрд░ рд╣рдореЗрдВ рдпрд╣ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо FILE_SHARE_DELETE рдзреНрд╡рдЬ рдХреЛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддреЗред рдПрдХ рдмрд╛рд░ рдЕрдВрджрд░ рдЖрдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд░рд╣рддрд╛ рд╣реИред рдФрд░ рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

2. рдПрдХ рдирдпрд╛ рдЧреЛ рдкреИрдХреЗрдЬ posix (рдХрд╣реАрдВ рд░реЗрдкреЛ рдореЗрдВ) рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде, Open , рдЬреЛ CreateFile рдХреЛ FILE_SHARE_DELETE рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдиреНрдпрдерд╛ os.Open рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ

рдореИрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИред рд▓реЗрдХрд┐рди, рдпрджрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ рдкреИрдХреЗрдЬ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, github.com/jstarks/posix рдХреЗ рд░реВрдк рдореЗрдВред рдирд╣реАрдВ? рд╣рдо рдкреИрдХреЗрдЬ рдХреЛ golang.org/x/sys/windows/posix рдпрд╛ рдХреБрдЫ рдФрд░ рдХреЗ рддрд╣рдд рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЬреНрдпрд╛рджрд╛ рдЕрдВрддрд░ рдирд╣реАрдВ рджрд┐рдЦрддрд╛ред

рдПрд▓реЗрдХреНрд╕

рдУрдПрд╕ рдкреИрдХреЗрдЬ рдХрд┐рд╕реА рднреА рдУрдПрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ ...
рд╣рдореЗрдВ FILE_SHARE_DELETE рдзреНрд╡рдЬ рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рд╕рд┐рд░реНрдл рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ ...
рд╣рдореЗрдВ FILE_SHARE_DELETE рдХреЗ рд▓рд┐рдП рдирдП рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рдиреЗ рд╣реЛрдВрдЧреЗред рдпреЗ рдкрд░реАрдХреНрд╖рдг рдХреНрдпрд╛ рд╣реЛрдВрдЧреЗ?

рдЗрди рд╕рднреА рдХреЛ рдКрдкрд░ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЕрдЧрд░ рдореИрдВ рдмрд╛рд╣рд░реА рдкреИрдХреЗрдЬ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ FILE_SHARE_DELETE рдлрд╝рд╛рдЗрд▓ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИред рдореБрдЭреЗ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛

рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рдзреНрд╡рдЬ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдФрд░ рддрд░реНрдХ рд╣реИред

рдореИрдВрдиреЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╡рд┐рдВрдбреЛрдЬрд╝ рдРрдкреНрд╕ рдХреА рддрд▓рд╛рд╢ рдХреЗ рд▓рд┐рдП рдЧреЛрд▓рд╛рдВрдЧ-рдирдЯреНрд╕ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛; рдореИрдВ рдЗрд╕реЗ рджреГрд╢реНрдпрдорд╛рди рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╣рд░ рдХреБрдЫ рджрд┐рдиреЛрдВ рдореЗрдВ рдкрд┐рдВрдЧ рдХрд░реВрдВрдЧрд╛ред рдпрджрд┐ рд╡рд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рддрд╣ рдкрд░ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ 1.14 рдХреЗ рд▓рд┐рдП рдЯрд┐рдк рдкрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛рдХрд░ рдЪреАрдЬреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
https://groups.google.com/d/topic/golang-nuts/8BiP_mPoCd4/discussion

рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рдзреНрд╡рдЬ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдФрд░ рддрд░реНрдХ рд╣реИред

рдмреАрдЯреАрдбрдмреНрд▓реНрдпреВред рдЙрд╕ рдзреНрд╡рдЬ рдХреЛ Linux рдкрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? Afau рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рднреА рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдЗрд╕ https://gavv.github.io/articles/file-locks/#open -file-description-locks-fcntl рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕реЗ рд▓рд┐рдирдХреНрд╕ рдХреЗ рдЖрдзреБрдирд┐рдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдзреНрд╡рдЬ (рдЬреИрд╕реЗ var OpenWithout_FILE_SHARE_DELETE = false ) рдХреЛ syscall_windows.go рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ syscall.Open() рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдХреБрдЫ Linux-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдзреНрд╡рдЬ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдирд╛рдо рд╣реЛрдЧрд╛, рдФрд░ syscall_linux.go рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдСрдлрд╣реИрдВрдб рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдПрдХ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдХреИрд╕реЗ рд░реЛрдХрд╛ рдЬрд╛рдПред рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓рд┐рдВрдХ "рд╕рд▓рд╛рд╣рдХрд╛рд░" рд▓реЙрдХрд┐рдВрдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

@jstarks рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо FILE_SHARE_DELETE рдзреНрд╡рдЬ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рд╣рдореЗрдВ рдпрд╣ рднреА рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЪрд▓ рд░рд╣реА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ FILE_SHARE_DELETE рдЭрдВрдбрд╛ рдпрд╣рд╛рдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрджрд┐ рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдирд╛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рднреА рдЪрд▓ рд░рд╣реА рд╣реИ, рддреЛ рд╣рдо рдХрд┐рд╕реА рднреА POSIX рд╕рдВрдЧрддрддрд╛ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдФрд░ FILE_SHARE_DELETE рдЭрдВрдбрд╛ рдЖрдзрд╛ рд╕рдорд╛рдзрд╛рди рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

рдЗрд╕рд╕реЗ рднреА рдЕрдзрд┐рдХ, рдХрднреА-рдХрднреА рд╣рдо рдЙрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╕рдорд╛рдкреНрдд рднреА рд╣реЛ рдЬрд╛рддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП #25965, #19491 рдФрд░ #32188 рджреЗрдЦреЗрдВред рдореВрд▓ рд░реВрдк рд╕реЗ рд╣рдо WaitForSingleObject рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рд╣реИрдВрдбрд▓ рдкрд░ рд╕рд┐рдЧреНрдирд▓ рд╣реЛрдиреЗ рддрдХ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ 5 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рдЬреЛрдбрд╝рдиреА рдкрдбрд╝реАред рдФрд░ рд╡рд╣ рднреА рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ - https://github.com/golang/go/issues/25965#issuecomment -482037476

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд, рд▓реЗрдХрд┐рди, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдореБрдЭреЗ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рд╣реИ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╡рд┐рдВрдбреЛрдЬрд╝-рдЖрд░реНрдо рдкреЛрд░реНрдЯ рдХреЛ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХрд░ рд╕рдХреЗрдВред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП #32135 рджреЗрдЦреЗрдВред рдореВрд▓ рд░реВрдк рд╕реЗ @ jordanrh1 рдкреЛрд░реНрдЯреЗрдб рд╡рд┐рдВрдбреЛрдЬрд╝-рдЖрд░реНрдо рдкрд░ рдЬрд╛рдПрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрдм рд╡рд┐рдВрдбреЛрдЬрд╝-рдЖрд░реНрдо рдмрд┐рд▓реНрдбрд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рдпрд╣ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдкреЛрд░реНрдЯ рдЕрднреА рднреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИред рдпрджрд┐ рдЖрдк рд╣рдореЗрдВ рдмрд┐рд▓реНрдбрд░ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рд╣рдо рд╡рд┐рдВрдбреЛрдЬрд╝-рдПрдо рдкреЛрд░реНрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛ рдкреЛрд░реНрдЯ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - https://github.com/golang/go/wiki/PortingPolicy рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, рдЕрдЧрд░ рдХреЛрдИ рд╡рд┐рдВрдбреЛрдЬ 10 рдЖрдИрдУрдЯреА рдкрд░ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рд╕рдорд░реНрдерди рд╣реИред рдЗрд╕реЗ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдЦреЛрдирд╛ рджреБрдЦрдж рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдмрд┐рд▓реНрдбрд░ рдирд╣реАрдВ рд╣реИред

рд╢реБрдХреНрд░рд┐рдпрд╛ред

рдПрд▓реЗрдХреНрд╕

рдЕрд╕реНрдерд╛рдпреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реБрдЭрд╛рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: https://github.com/golang/go/issues/25965#issuecomment -495636291

рдЧреЛрд▓рдВрдЧ-рдирдЯреНрд╕ рдкреЛрд╕реНрдЯ рд╕реЗ рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ; рдПрдХ рдирдпрд╛ рд╕реВрддреНрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛:
https://groups.google.com/d/topic/golang-nuts/aRvSo3iKvJY/discussion

рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЧреИрд░-рдХрд╛рд▓реНрдкрдирд┐рдХ рдЪрд┐рдВрддрд╛ рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рдВрдЪ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рд╡рд╣ рдлрд╝рд╛рдЗрд▓ рд▓реЙрдХрд┐рдВрдЧ рдФрд░ рдЙрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдкрд░ рдкреНрд░рднрд╛рд╡ рд╣реЛрдЧрд╛ред

рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓ рдХреЛ FILE_SHARE_DELETE рд╕рд╛рде рдЦреЛрд▓рдирд╛ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ LockFileEx рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ POSIX рд╕рд▓рд╛рд╣рдХрд╛рд░ рддрд╛рд▓реЛрдВ рд╕реЗ рдХрдордЬреЛрд░ рдХрд░ рджреЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ FILE_SHARE_DELETE рдХрд┐рд╕реА рднреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдХреЛрдИ рд▓реЙрдХ рд╣реЛ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред 1

рдмреЗрд╢рдХ рдпрд╣ рдХреЗрд╡рд▓ LockFileEx рдХреЙрд▓ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдЧрд╛, рдЬреЛ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЗ рд╕рд╛рде os.File.Fd рд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдЧреЛ рдлрд╝рд╛рдЗрд▓ рд▓реЙрдХрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ 33 рдЬреНрдЮрд╛рдд рдЖрдпрд╛рддрдХ рд╣реИрдВ , рдЬрд┐рд╕рдореЗрдВ рдбреЙрдХрд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ) , gVisor, рдФрд░ Kubernetes)ред рдпрд╣ рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ LockFileEx рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рдЧреЛ рдХреЛрдб рдХреЗ рднрд╛рд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЕрднреА рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрджрд▓рд╛рд╡ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдорд╛рдорд▓реЗ рдореЗрдВ (рдФрд░ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рд╕реАрд╡реАрдИ-рдлреИрдХреНрдЯреНрд░реА) рдПрдХ рдЧреИрд░-рд╕рд▓рд╛рд╣ рдкреНрд░рдпрд╛рд╕ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рдХреИрд╕реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдкрд╖реНрдЯ рдХреЛрдб рдЯреВрдЯрдиреЗ рд╕реЗ рдирдХрд▓реА рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИред

рдореБрдЭреЗ рдпрд╣ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧреЛрд▓рдВрдЧ-рдирдЯреНрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрдиреЗ рдирд╣реАрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдЧреЛ рдЯреАрдо рдХреА рдЕрдиреБрдорддрд┐ рд╕реЗ, рдЧреЛрд▓рд╛рдВрдЧ-рджреЗрд╡ рдкрд░ рдПрдХ рдкреЛрд╕реНрдЯ рдЪрд░реНрдЪрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╣реЛ рд╕рдХрддреА рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдЪреВрдВрдХрд┐ рдпрд╣ рдПрдХ рдореБрдЦреНрдп рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ)ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдЧреЛ рдЯреВрд▓рдЪреИрди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрдкрд░реЛрдХреНрдд рддрд░реАрдХреЗ рд╕реЗ LockFileEx рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ред


1 рд╣рд╛рдВ, рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╡рд┐рдВрдбреЛрдЬрд╝ рд▓реЙрдХ рдкреНрд░рд╡рд░реНрддрди рдЕрднреА рднреА рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдХреЛ рдиреНрдпреВрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрд╕рд╛рдзрди рдЖрд░рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд▓реЙрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдВрдбреЛ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрд▓рд╛ рддреЛ рдореИрдВрдиреЗ рдЧреЛрд▓рд╛рдВрдЧ-рджреЗрд╡ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ред
https://groups.google.com/d/topic/golang-dev/R79TJAzsBfM/discussion

рдХреНрдпрд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪреАрдмрджреНрдз рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА GOOS=windows рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ? рдЖрдкрдиреЗ рдмрд╛рд░-рдмрд╛рд░ рджрд╛рд╡рд╛ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХрднреА рдХреЛрдИ рд╕рдмреВрдд рдирд╣реАрдВ рджрд┐рдпрд╛ред

рдХреГрдкрдпрд╛ рд╕рдирд╕рдиреАрдЦреЗрдЬ рдЕрд╕рдорд░реНрдердиреАрдп рдмрдпрд╛рди рджреЗрдирд╛ рдмрдВрдж рдХрд░реЗрдВред рдпрд╣ рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрд╣ рдЖрдкрддреНрддрд┐рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИред

рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреЛрд▓рд╛ рддреЛ рдореИрдВрдиреЗ рдЧреЛрд▓рд╛рдВрдЧ-рджреЗрд╡ рдХреЛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ред https://groups.google.com/d/topic/golang-dev/R79TJAzsBfM/discussion

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рдореМрдЬреВрдж рд╕рднреА рд▓реЛрдЧреЛрдВ рдиреЗ рдЕрдкрдиреЗ-рдЕрдкрдиреЗ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ (рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ), рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрдм рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЛ рдЧреЛ 1.14 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЙрд╕ рдкрд░ рдПрдХ рдЕрдиреБрд╡рд░реНрддреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдзрд╛рдЧрд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд╕реНрдорд╛рд░рдХ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде)ред

рдХреНрдпрд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪреАрдмрджреНрдз рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА GOOS=windows рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ? рдЖрдкрдиреЗ рдмрд╛рд░-рдмрд╛рд░ рджрд╛рд╡рд╛ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХрднреА рдХреЛрдИ рд╕рдмреВрдд рдирд╣реАрдВ рджрд┐рдпрд╛ред

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рд╕реБрд░рдХреНрд╖рд╛ рдореВрд▓реНрдпрд╛рдВрдХрди ( рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╕рдмреВрдд рдкреНрд░рджрд╛рди рдХрд┐рдП рд╣реИрдВ рдХрд┐ рд▓реЛрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдзреНрд╡рдЬ рдХреА рд╢реБрд░реВрдЖрдд рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рд╡рд╣ GitHub рдкрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рдХреЛрдб рд╣реИред

рдХреГрдкрдпрд╛ рд╕рдирд╕рдиреАрдЦреЗрдЬ рдЕрд╕рдорд░реНрдердиреАрдп рдмрдпрд╛рди рджреЗрдирд╛ рдмрдВрдж рдХрд░реЗрдВред рдпрд╣ рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдпрд╣ рдЖрдкрддреНрддрд┐рдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИред

рдпрджрд┐ рд▓рд┐рдВрдХ рдФрд░ рдХреЛрдб рдкрд░реНрдпрд╛рдкреНрдд рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдХреА рдкреБрд╕реНрддрдХ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдЖрдкрдХреЛ рдРрд╕рд╛ рдХреЛрдб рдирд╣реАрдВ рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдХрд╛рд░рдг рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХреЛрдб рдорд┐рд▓реЗрдЧрд╛ рдЬреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЙрд╕ рдХреЛрдб рдХреЛ "рдЯреВрдЯрд╛ рд╣реБрдЖ" рдорд╛рдирддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЙрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдХрд╛рд░рдгред

рдореЗрд░реА рдЖрдкрддреНрддрд┐ рдХреЛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рди рд▓реЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ (рдЖрдк рд╕рд╣рд┐рдд) рд╣рд░ рдХреЛрдИ рднрд╛рд╖рд╛ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЗрдирдкреБрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдореБрдЦреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рдЪреИрдВрдкрд┐рдпрди рдмрдирдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕реНрд╡рд╕реНрде рдкреНрд░рддрд┐рд░реЛрдз рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдмрддрд╛рдпрд╛, FILE_SHARE_DELETE рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдореЗрдВ UNIX рдХреА рдПрдХ рдЬреИрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдЗрди рдЪрд░рдгреЛрдВ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

main.c

#include <windows.h>
#include <stdio.h>

int
main() {
  // ensure delete the file
  DeleteFile("test.txt");

  // create test.txt with FILE_SHARE_DELETE
  HANDLE h = CreateFile("test.txt",
      GENERIC_READ | GENERIC_WRITE,
      FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
      NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  puts("waiting 10sec, please run watch.exe on another cmd.exe");
  Sleep(10000);
  if (DeleteFile("test.txt")) {
    puts("deleted");
  }
  getchar();
  return 0;
}

рдШрдбрд╝реА.рд╕реА

#include <stdio.h>
#include <shlwapi.h>

int
main() {
  // waiting test.txt will be removed.
  while (PathFileExists("test.txt")) {
    puts("watching...");
    Sleep(1000);
  }
  // now test.txt should not exists. So this is possible to create new file
  system("notepad test.txt");
  return 0;
}

рдореЗрдХрдлрд╝рд╛рдЗрд▓

all : main.exe watch.exe

watch.exe : watch.c
    gcc -o watch.exe watch.c -lshlwapi

main.exe : main.c
    gcc -o main.exe main.c

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреГрдкрдпрд╛ main.exe рдЪрд▓рд╛рдПрдБ рдФрд░ рдЕрдЧрд▓рд╛ watch.exe рдЪрд▓рд╛рдПрдБред UNIX рдкрд░, рдЕрдирд▓рд┐рдВрдХ(2) рдлрд╝рд╛рдЗрд▓ рдХреЛ рддреБрд░рдВрдд рд╣рдЯрд╛ рджреЗрдВред рддреЛ рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рджреЗрдЦ рд░рд╣реА рд╣реИ рд╡рд╣ рдПрдХ рд╣реА рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рд╕рд╛рде рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░, notepad.exe рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрд╡рд╛рдж "рдПрдХреНрд╕реЗрд╕ рдЙрд▓реНрд▓рдВрдШрди" рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдлрд╝рд╛рдЗрд▓ рдХреЛ рддреБрд░рдВрдд рдирд╣реАрдВ рд╣рдЯрд╛рддрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ рдХрд┐ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдорд╕рд▓рд╛? рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлрд╛рдЗрд▓реЗрдВ рдЦреЛ рдЧрдИрдВ? рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред

@ рд╣реИрд╡реЛрдХ-рдЖрдИрдУ рд╡рд┐рдВрдбреЛрдЬрд╝ рдмрдВрдж рд╣реЛрдиреЗ рддрдХ рдПрдХ рдЦреБрд▓реА рдлрд╛рдЗрд▓ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рдПрдЧрд╛, рдФрд░ рдХреЗрд╡рд▓ рдЦреБрд▓реА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рддрд╛рд▓реЗ рд░рдЦреЗрдЧрд╛ред рддреЛ рд▓реЙрдХрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ os.Remove() рдХреА рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрд╕ рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВ рдЕрдЧрд▓реЗ рд╕рдкреНрддрд╛рд╣ рдЧреЛрд▓рд╛рдВрдЧ-рджреЗрд╡ рд╕реВрддреНрд░ рдХреЛ рдкрд┐рдВрдЧ рдХрд░реВрдБрдЧрд╛ред рджреЛ рдкреАрдкреАрдПрд▓ рдиреЗ рдЗрд╕рдХрд╛ рдЬрд╡рд╛рдм рджрд┐рдпрд╛; рдХрд┐рд╕реА рдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдирд╣реАрдВ рдкрдврд╝рд╛ рдерд╛, рдФрд░ рди рд╣реА рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдерд╛ред

рд╕рдирд╕рдиреАрдЦреЗрдЬ, рдЕрд╕рдорд░реНрдердиреАрдп рджрд╛рд╡реЗ "рд╕реНрд╡рд╕реНрде рдкреНрд░рддрд┐рд░реЛрдз" рдирд╣реАрдВ рд╣реИрдВред

@ рд╣реИрд╡реЛрдХ-рдЖрдИрдУ рд╡рд┐рдВрдбреЛрдЬрд╝ рдмрдВрдж рд╣реЛрдиреЗ рддрдХ рдПрдХ рдЦреБрд▓реА рдлрд╛рдЗрд▓ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рдПрдЧрд╛, рдФрд░ рдХреЗрд╡рд▓ рдЦреБрд▓реА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рддрд╛рд▓реЗ рд░рдЦреЗрдЧрд╛ред рддреЛ рд▓реЙрдХрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ os.Remove() рдХреА рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдРрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрд╕ рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред

@networkimprov рдЖрдк рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЙрдХрд┐рдВрдЧ рдХрд╛

рд▓реЙрдХ рдлрд╝рд╛рдЗрд▓реЗрдВ (рдЬреИрд╕рд╛ рдХрд┐ LockFileEx рд╕рд╛рде рд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдорддреМрд░ рдкрд░ рдХрд┐рд╕реА рд╕рдВрд╕рд╛рдзрди рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдореЙрди рдЪрд▓рдиреЗ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рд╣реИред рдпрджрд┐ рдПрдХ рд╡рд┐рдВрдбреЛрдЬрд╝ рдЧреЛ рдбреЗрдореЙрди рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдлрд╝рд╛рдЗрд▓ рдкрд░ LockFileEx рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд▓реЙрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд▓реЙрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЗрд╕рдХреЗ рдиреАрдЪреЗ рд╕реЗ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди, рдпрджрд┐ FILE_SHARE_DELETE рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реИ, рддреЛ рдЙрд╕ рдзрд╛рд░рдгрд╛ рдХреЛ рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдореМрдЬреВрджрд╛ рдХреЛрдб рдЕрдм рд╕рд╣реА рдирд╣реАрдВ рд╣реИрдВред рдпрджрд┐ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдПрдЬреЗрдВрдЯ рдЙрд╕ рд▓реЙрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИ), рддреЛ рдореВрд▓ рдбреЗрдореЙрди рдЕрднреА рднреА рдЪрд▓ рд░рд╣рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдирдпрд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ LOCKFILE_FAIL_IMMEDIATELY рдзреНрд╡рдЬ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓реЙрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ LockFileEx рд▓реЙрдХ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдмрд╛рд░реА рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд▓реЙрдХ рдлрд╝рд╛рдЗрд▓ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рд╣рдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╕рд╛рде рдХрдИ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред

рд╕рдирд╕рдиреАрдЦреЗрдЬ, рдЕрд╕рдорд░реНрдердиреАрдп рджрд╛рд╡реЗ "рд╕реНрд╡рд╕реНрде рдкреНрд░рддрд┐рд░реЛрдз" рдирд╣реАрдВ рд╣реИрдВред

рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдХреЛрдИ рднреА рд╕рдирд╕рдиреАрдЦреЗрдЬ рдпрд╛ рдЕрд╕рдорд░реНрдердиреАрдп рджрд╛рд╡реЗ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рд░ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рд╕реЗ рдЕрд╕рд╣рдордд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рднреА рд╢рд╛рдорд┐рд▓ рд╣реВрдВ, рдиреЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдареЛрд╕ рддрд░реНрдХ рджрд┐рдП рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рдХрд┐рдпрд╛ рд╣реИред

рдХреГрдкрдпрд╛ WinAPI рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ; рд╡рд┐рдВрдбреЛрдЬрд╝ рдмрдВрдж рд╣реЛрдиреЗ рддрдХ рдПрдХ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛рдПрдЧрд╛, рдФрд░ рдХреЗрд╡рд▓ рдЦреБрд▓реА рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП LockFileEx() рд▓реЙрдХ рд░рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рд▓реЙрдХ рдЬрд╛рд░реА рдирд╣реАрдВ рд░рд╣ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрджред рдбрд┐рд▓реАрдЯ рдХреЗ рдмрд╛рдж рдПрдХ рд▓реЙрдХ (рдпрд╛рдиреА рдУрдкрди) рдлрд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рджреВрд╕рд░рд╛ рд▓реЙрдХ рд╣рд╛рд╕рд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрд╛ред рд▓реЙрдХ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рдереНрд░реЗрдб рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреБрд▓реА рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧреАред

рдЬрдм рддрдХ рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдирд╣реАрдВ рдкрдврд╝рддрд╛, рдЖрдкрдХреЗ рдкрд┐рдЫрд▓реЗ рджреЛ рдкрд░рд┐рджреГрд╢реНрдп рдЕрд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рдФрд░ рдпрд╣ рд╕рдирд╕рдиреАрдЦреЗрдЬ рдФрд░ рдЕрд╕рдорд░реНрдерд┐рдд рдерд╛: "рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ ... рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рд╕реАрд╡реАрдИ-рдХрд╛рд░рдЦрд╛рдирд╛ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рдХрд┐ рд╕реНрдкрд╖реНрдЯ рдХреЛрдб рдЯреВрдЯрдиреЗ рд╕реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрд╕реНрдкрд╖реНрдЯ рд▓рд╛рдн рдХреИрд╕реЗ рд╣реЛрддреЗ рд╣реИрдВред"

@networkimprov рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрд╕рд╛рдзрди-рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд▓реЙрдХ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЖрдорддреМрд░ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдкрде рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИрдВред рдлрд╝рд╛рдЗрд▓ рдмрдВрдж рд╣реЛрдиреЗ рддрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлрд╝рд╛рдЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ DeleteFile рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо 1 рдкрд░ рдкрд┐рдЫрд▓реЗ рдкрде рдкрд░ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдЕрдиреНрдп рд▓реЙрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЙрд╕ рдкрде рдкрд░, рд▓реЙрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рдирдХрд╛рд░рддреЗ рд╣реБрдПред

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдирд╕рдиреАрдЦреЗрдЬ рдЯрд┐рдкреНрдкрдгреА рдереА - рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рд╕реБрд░рдХреНрд╖рд╛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдб рдХреБрдЫ рдУрдПрд╕ рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ рдЬреЛ рдЕрдм рд╕рддреНрдп рдирд╣реАрдВ рд╣реИрдВред рдФрд░ рдпрд╣рд╛рдВ рд▓рд╛рдн рдмрд╣реБрдд рдЕрд╕реНрдкрд╖реНрдЯ рд▓рдЧрддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдХрдИ рд▓реЛрдЧреЛрдВ рдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рд╣реИ: рдпрд╣ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рдФрд░ рдЯреВрдЯрдирд╛ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ (рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рд▓реЙрдХрд┐рдВрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рддреЛрдбрд╝рддрд╛ рд╣реИ)ред

1 рдХрдо рд╕реЗ рдХрдо рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬрдм рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред

рдкреБрди: "рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рд╣рдордиреЗ https://github.com/golang/go/issues/ рд╕реЗ 'POSIX' рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DeleteFile (NTFS рдкрд░) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рдЬрд╣рд╛рдВ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдиреЗрдорд╕реНрдкреЗрд╕ рд╕реЗ рддреБрд░рдВрдд рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛"ред

рдкреБрди: рд▓рд╛рдн, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкреВрд░реЗ рд╕реВрддреНрд░ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

AFAIK рд╡рд┐рдВрдбреЛрдЬ рдХрд╛ рд╡рд╣ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

@networkimprov рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдВрдбреЛрдЬ 10 рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдорд▓рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ LockFileEx рд╕рд╛рде рд▓реЙрдХ рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╕рдордп FILE_SHARE_DELETE рдХреЛ CreateFileW рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

DeleteFileW() рдЙрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ред рдЖрдк рдХреИрд╕реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рддреБрд░рдВрдд рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдмрдирд╛рдо рдлрд╛рдЗрд▓/рдРрдк рдкрд░ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛? рдХреНрдпрд╛ рдЖрдкрдиреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдЙрд╕реЗ рдЦреЛрд▓рдиреЗ/рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛?

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ рдЧреЛ рдЯреВрд▓рдЪреЗрди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ _also_ рдЙрдкрд░реЛрдХреНрдд рддрд░реАрдХреЗ рд╕реЗ LockFileEx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

go рдХрдорд╛рдВрдб рдХреЗ рднреАрддрд░ рд╣рдо рдмрд╣реБрдд рдЕрдзрд┐рдХ POSIX рд╢рдмреНрджрд╛рд░реНрде рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ FILE_SHARE_DELETE рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ cmd/go/internal/robustio рдкреИрдХреЗрдЬ рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ _рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рд╡рд┐рдВрдбреЛрдЬрд╝ рдлрд╝рд╛рдЗрд▓-рд▓реЙрдХрд┐рдВрдЧ рдкреЙрдЬрд╝рд┐рдХреНрд╕ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛ рдЬрд╛рддреА рд╣реИред

@ianlancetaylor рдореИрдВрдиреЗ рдЧреЛрд▓рд╛рдВрдЧ-рдирдЯреНрд╕ рдФрд░ -рджреЗрд╡ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдЯрд┐рдкреНрдкрдгреА рдорд╛рдВрдЧ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди (рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд) рд╡рд┐рдВрдбреЛрдЬ syscall.Open() рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдПрдХ рднреА рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╕рд╛рдордиреЗ рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдХрдИ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдЬрд┐рдиреНрд╣реЗрдВ FILE_SHARE_DELETE рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдКрдкрд░ рджрд┐рдЦрд╛рдИ рджрд┐рдП рд╣реИрдВ (рдФрд░ рдЪреВрдВрдХрд┐ Microsoft рдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ), рдЖрдЗрдП рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рдкреВрд░реНрд╡-рд░рд┐рд▓реАрдЬрд╝ 1.14 рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░реЗрдВ, рдФрд░ рдЪрдХреНрд░ рдХреЗ рджреМрд░рд╛рди рдореВрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рддрд╣ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдкрд╣рд▓реЗ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЬрд┐рд╕реЗ рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рдмрд┐рдирд╛ рдПрдХ open() рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ CreateFileW() & os.NewFile() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд░реЛрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдПрдХ рдШреБрдВрдбреА рдХрд╛ рдкрд░реНрджрд╛рдлрд╛рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд▓реЙрдЧ рд░реЛрдЯреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред

рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд▓реЙрдЧ рд░реЛрдЯреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ FILE_SHARE_DELETE рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╣реИрдВрдбрд▓ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЗ рд╕рд╛рде рдирдИ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

@ рд░реИрдВрдбрдо-рд▓рд┐рдпреВ рдХреНрдпрд╛ рдЖрдк рдУрдкрди() рдкрд░ fsd рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдпрд╛ рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ?

@mattn рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред os.Rename рдкреБрд░рд╛рдиреА рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рдж, рдореИрдВ рдУрд░рд┐рдЬрд┐рдирд▓ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдореЙрди рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

@networkimprov рдореИрдВ FILE_SHARE_DELETE рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реАрдзреЗ syscall.CreateFile рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдореЗрд░рд╛ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕рдВрд╕реНрдХрд░рдг:

Major  Minor  Build  Revision
-----  -----  -----  --------
10     0      17763  0

@ рд░реИрдВрдбрдо-рд▓рд┐рдпреВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдпреВрдирд┐рдХреНрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

https://github.com/golang/go/issues/32088#issuecomment -510345908

рдмрд╛рд╣рд░реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ред

рдореИрдЯрди, рдЙрд╕ рдмрд┐рдВрджреБ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд░рд╣рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╣реИрдВрдбрд▓ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЛ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ (рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░) рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреЗрд╢реЗрд╡рд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд▓реЙрдЧрд░реЛрдЯреЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

@ianlancetaylor рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ :

рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд░рд┐рд▓реАрдЬ рдЕрд╡рд░реЛрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рд╣реИред

@bcmills рдХреНрдпрд╛ рдореИрдВ рдЖрдкрдХреЛ CL рдкреЛрд╕реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА

рдпрд╣ рдкрдВрдХреНрддрд┐: https://golang.org/src/syscall/syscall_windows.go#L291
рдмрд╕ рдЬрд░реВрд░рдд рд╣реИ: sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE)

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдПрдХ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдЧрд╛, рдлрд┐рд░ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рд╣рдореЗрдВ рдЬрд▓реНрдж рд╣реА рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдлреНрд░реАрдЬ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рдореБрджреНрджреЗ рдХреЗ рд╕рд╛рдордиреЗ рдЖрдиреЗ рдХрд╛ рд╕рдордп рд╣реЛ...

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ os.Remove() рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░, рдлрд╝рд╛рдЗрд▓ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред Windows рдХрд┐рд╕реА рдЦреБрд▓реА рд╣реБрдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рд╣реЛрдиреЗ рддрдХ рдбрд┐рд▓реАрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг https://github.com/golang/go/issues/32088#issuecomment -502850674 рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/papertrail/go-tail/pull/10#issuecomment -529460973 рджреЗрдЦреЗрдВред рдЕрдм рд╣рдо рд╣рдЯрд╛рдП рдЧрдП рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рднрд▓реЗ рд╣реА рдкреБрд░рд╛рдиреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрднреА рднреА рдЦреБрд▓реЗ рд╣реИрдВрдбрд▓ рд╣реЛрдВ, рдмрд╢рд░реНрддреЗ рдХрд┐ рд╡реЗ рд╣реИрдВрдбрд▓ FILE_SHARE_DELETE рд╕рд╛рдЭрд╛рдХрд░рдг рдореЛрдб рдХреЗ рд╕рд╛рде рдЦреЛрд▓реЗ рдЧрдП рд╣реЛрдВред рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдЧреЛ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ FILE_SHARE_DELETE рд╕реЗрдЯ рдХрд░рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ?

рдпрд╣реА рдЗрд░рд╛рджрд╛ рд╣реИ; рд╣рдореЗрдВ рд╕реАрдПрд▓ рдЬрдорд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдХрд┐рд╕реА рдХреА рдЬрд░реВрд░рдд рд╣реИред (рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕реАрдПрд▓рдП рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред)
рдореЗрд░реА рдкрд┐рдЫрд▓реА рджреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИрдВ...

@jstarks @jordanrh1 @thaJeztah

рдкреНрд░рд╢реНрди:
рд╣рдо рдПрдХ рд╕реБрд╕рдВрдЧрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ?
рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо "рдирд╡реАрдирддрдо рд╡рд┐рдВрдбреЛрдЬрд╝" рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рддреЛ рдпрд╣ "рд▓рдВрдмрд┐рдд рдбрд┐рд▓реАрдЯ" рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рдорд╛рди рдирд╛рдо рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдкреБрд░рд╛рдирд╛ рд╕рдВрд╕реНрдХрд░рдг рддреНрд░реБрдЯрд┐ рдкрд░ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реИ: "рдкрд░реАрдХреНрд╖рд╛ рдЙрддреНрддреАрд░реНрдг / рдХреНрдпреВрдП рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓рдХреНрд╖реНрдпреЛрдВ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛", рдФрд░
рднрд╡рд┐рд╖реНрдп рдореЗрдВ "рдЖрдорддреМрд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХрднреА-рдХрднреА рдирд╣реАрдВ" (рдЕрдм рд╕реЗ 2 рд╕рд╛рд▓ рджреВрд░ рдПрдХ рдбреЗрд╡рд▓рдкрд░ "рдлрд╝рд╛рдЗрд▓ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╛рд╣рд░ рдирд┐рдХрд▓реЗрдВ" рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛)ред

рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ 'рдкреБрд░рд╛рдиреЗ' рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдпрд╛ рддреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓реЗрдВ рдпрд╛ рддреНрд░реБрдЯрд┐ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВ рдпрджрд┐ "рдХреЛрдИ рд▓рдВрдмрд┐рдд рд╡рд┐рд▓реЛрдкрди рд╣реИ" - рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдЕрдЧрд░ рд╣рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рддреЛ рд╣рдо рдЕрд╕рдВрдЧрддрд┐ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред

@guybrand рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ "рдлрд╝рд╛рдЗрд▓ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХреЛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдиреЗ рдкрд░ рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред"

рдпрд╣ рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рд╡рд┐рдВрдбреЛрдЬ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ: "рд╣рдореЗрд╢рд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд╛рдо рдмрджрд▓реЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдирдП рд╡рд┐рдВрдбреЛрдЬрд╝ рдпрд╛ рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдкрд░ рднреА"
рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИ - рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЕрднреНрдпрд╛рд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рд░ рдЬрдЧрд╣ рд╕рдлрд▓ рд╣реЛрдЧрд╛ред

рдмрджрд▓реЗрдВ https://golang.org/cl/194957 рдЗрд╕ рдореБрджреНрджреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реИ: syscall: allow FILE_SHARE_DELETE on syscall.Open on Windows

golang-nuts рдзрд╛рдЧрд╛ рдпрд╣рд╛рдБ рд╣реИ , рдФрд░ рдЗрд╕рдХрд╛ рдХреЛрдИ рдЬрд╡рд╛рдм рдирд╣реАрдВ рдерд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рдЬреЛ golang-nuts рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдЙрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред

golang-dev рдзрд╛рдЧреЗ рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ рд╣реИрдВ , рдФрд░ рдмрд╛рдж рд╡рд╛рд▓реЗ (рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХреЗ рдзрд╛рдЧреЗ) рдХреЛ рднреА рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИред

@alexbrainman -2'd CL рдирд┐рд░реНрдгрдп рдХреА рд╕реНрдкрд╖реНрдЯ рдХрдореА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ NeedsDecision рд░реВрдк рдореЗрдВ рдкреБрдирдГ рд▓реЗрдмрд▓ рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдПрдХ рд╕реНрдкрд╖реНрдЯ рджрд┐рд╢рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВред

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореЗрд░реЗ рд▓рд┐рдП рдирд┐рд░реНрдгрдп рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ: рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреЗ рд▓реЛрдЧ FILE_SHARE_DELETE (https://github.com/golang/go/issues/32088) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ рд╣реИрдВред #issuecomment-502850674), рдФрд░ рдпрд╣ рдХрд┐ golang-nuts рдкрд░ рдХреЛрдИ рднреА рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдпрд╣ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рд╕реВрддреНрд░ рдкрд░ рдореИрдВрдиреЗ рдЬреЛ рдЖрдкрддреНрддрд┐рдпрд╛рдБ рджреЗрдЦреА рд╣реИрдВ, рд╡реЗ рджреЛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрддреА рд╣реИрдВ:

  1. @alexbrainman рдХреА рдЪрд┐рдВрддрд╛ (https://github.com/golang/go/issues/32088#issuecomment-504321027) рдФрд░ @mattn (https://github.com/golang/go/issues/32088#issuecomment-494417146) рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪреВрдВрдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрднреА рднреА POSIX рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП POSIX рд╢рдмреНрджрд╛рд░реНрде рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред (рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдорд▓рд╛ рд╣реИ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ Open рдкреЙрдЬрд╝рд┐рдХреНрд╕ рд╕реЗрдореЗрдиреНрдЯрд┐рдХреНрд╕ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдЪрд┐рдВрддрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд▓рдЧрддреА рд╣реИред)

  2. @ havoc-io рдХреА рдЪрд┐рдВрддрд╛ (https://github.com/golang/go/issues/32088#issuecomment-510314947) рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ FILE_SHARE_DELETE рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЪрд▓рдиреЗ рдкрд░ рдлрд╝рд╛рдЗрд▓-рд▓реЙрдХрд┐рдВрдЧ рдкреИрдХреЗрдЬ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЗрдирд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рдХрдо рдХрд░ рджреЗрдЧрд╛ . рд▓реЗрдХрд┐рди рдпрд╣ рддрд░реНрдХ рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рдареЛрд╕ рдкреИрдХреЗрдЬ ( github.com/gofrs/flock ) рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдиреЛрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ "рд▓реЙрдХрд┐рдВрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рд╕рдорд╛рди рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ", рдФрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдСрдбрд┐рдЯ рд╕реЗ рдХреЛрдИ рднреА рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рд▓реЙрдХрд┐рдВрдЧ рдФрд░ рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмреАрдЪ рд╡рд┐рдВрдбреЛрдЬрд╝-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

https://github.com/golang/go/issues/32088#issuecomment -498690757 рдореЗрдВ рдЯрд┐рдкреНрдкрдгреА рдореБрдЭреЗ рд╕рд╛рдЬрд╝рд┐рд╢ рдХрд░рддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐:

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ @ianlancetaylor рдкреВрд░реЗ https://codereview.appspot.com/823043/ рдореЗрдВ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИ, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИред рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓ рдХреЛ рд▓реЙрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рд╡рд╛рд▓реА рдПрдХ рддрддреНрдХрд╛рд▓ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╣рдо рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

@maruel , рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рд╡рд┐рд╡рд░рдг рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрд╝рд╛рдЗрд▓-рд▓реЙрдХрд┐рдВрдЧ рдФрд░ рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛рдиреЗ рдпрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рдмреАрдЪ рд╡рд┐рдВрдбреЛрдЬрд╝-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкрд░ рдХреИрд╕реЗ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ?

рд╣рдо рдХреНрд░реЛрдо рдЗрдВрдлреНрд░рд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЙрдХрд┐рдВрдЧ рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреНрдпрд╛рджрд╛ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЬреЛ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдЙрд╕рд╕реЗ O_CREATE + FILE_FLAG_DELETE_ON_CLOSE рд╢рдмреНрджрд╛рд░реНрде рдЗрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ рдФрд░ рдЗрд╕реЗ Global\\ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рдПрдХ рдореНрдпреВрдЯреЗрдХреНрд╕ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╛рдпрдерди рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИ:

path := "delete-after-open"
fd, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE, 0600)
if err != nil { ... }
// defer statements are executed in LIFO
defer os.Remove(path)            // or defer os.Rename(path, path+"2")
if err != nil { ... }
defer fd.Close()

рдЗрд╕рдХреА рджреЛ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ:

  • рдмрдВрдж рдХрд░реЗрдВ () рдУрдкрди рдХреЗ рдареАрдХ рдмрд╛рдж рдирд╣реАрдВ рд╣реИ ()
  • рддреНрд░реБрдЯрд┐ рдХреЛрдб рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ

@iwdgo рдпрд╣ рд╕рдорд╛рдзрд╛рди рдПрдХрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣реИред рдКрдкрд░ рдХреА рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪрд░реНрдЪрд╛ рдХрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рд╕рдорд╡рд░реНрддреА рдкрд╣реБрдВрдЪ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдпрд╣реА рдзреНрд╡рдЬ рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрдирд╛рддрд╛ рд╣реИред

рдореБрджреНрджреЗ рдХреЗ рдкреБрдирд░реНрдореВрд▓реНрдпрд╛рдВрдХрди рджреЗрдЦреЗ :

Mingw-w64 рдиреЗ рдЗрд╕реЗ рд╕рд╛рдд рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛ рджрд┐рдпрд╛ рдерд╛:
https://sourceforge.net/p/mingw-w64/code/HEAD/tree/stable/v3.x/mingw-w64-headers/include/ntdef.h#l858

Erlang рдиреЗ рдЗрд╕реЗ рдЫрд╣ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмрдирд╛ рджрд┐рдпрд╛ рдерд╛: erlang/ otp@0e02f48

рдЬрд┐рд╕ рд╕рдордп рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛, рдЙрд╕ рд╕рдордп MSVC рд░рдирдЯрд╛рдЗрдо рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдкрд╛рдпрдерди рдЗрд╕реЗ рдЕрдкрдирд╛ рдирд╣реАрдВ рд╕рдХрд╛: https://bugs.python.org/issue15244

рдПрдХ рджреВрд╕рд░реЗ рдЧреЛрд▓рдВрдЧ-рдирдЯреНрд╕ рдереНрд░реЗрдб рдиреЗ рднреА рдХреЛрдИ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рджреЗрдЦреА:
https://groups.google.com/d/topic/golang-nuts/aRvSo3iKvJY/discussion

рдХреНрдпрд╛ рдЖрдк Open() рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ FILE_SHARE_DELETE рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рд╣рдорд╛рд░реА рдЪрд░реНрдЪрд╛ рдпрд╣ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

  1. @alexbrainman ( #32088 (рдЯрд┐рдкреНрдкрдгреА) ) рдХреА рдЪрд┐рдВрддрд╛ ... рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрднреА рднреА POSIX рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рдПрдЧрд╛ ...

рдореЗрд░реА рдореБрдЦреНрдп рдЪрд┐рдВрддрд╛ рд▓реЛрдЧреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рддреЛрдбрд╝рдирд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ https://codereview.appspot.com/8203043/#msg10 рдкрд░ рдХрд╣рд╛ рд╣реИред

рджреВрд╕рд░рд╛ рдХрд╛рд░рдг: рд╡рд┐рдВрдбреЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдирд╛рдо рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ рдпрд╛
рдПрдХ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЖрджрд░реНрд╢ рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдЕрднреНрдпрд╕реНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИред

рд╣рдо рдпрд╣рд╛рдВ рдЧреЛ 1.0 рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЪреБрдкрдЪрд╛рдк рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ, рд╢рд╛рдпрдж рд▓реЛрдЧ
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВред

рдпрд╣рд╛рдВ рдЧреЛ 1.0 рд╕рдВрдЧрддрддрд╛ рд╡рд╛рджреЗ рдХрд╛ рдХреНрдпрд╛ рд╣реБрдЖ? рдЬрд╣рд╛рдВ https://golang.org/doc/go1compat рдореЗрдВ рдпрд╣ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдХрд┐ рдпрджрд┐ рдЖрдк go-nuts рдкрд░ рдЕрдкрдиреЗ рдЗрд░рд╛рджреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЦреБрд▓реЗ рдлрд╝рд╛рдЗрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдареАрдХ рд╣реИ?

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рдЧреЛ 2 рдХреЛ рдкреЗрд╢ рдХрд░ рджреЗрддреЗ рд╣реИрдВ рддреЛ рд╢рд╛рдпрдж рд╣рдо рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рд╣рдо рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдЯреВрдЯрдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдореБрдЭреЗ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЧрд▓рдд рд╣реИ рдХрд┐ рдХрд┐рд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдореЗрд░реЗ рд▓рд┐рдП рдирд┐рд░реНрдгрдп рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ: рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕ рдзрд╛рдЧреЗ рдкрд░ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреЗ рд▓реЛрдЧ FILE_SHARE_DELETE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд╕рдорд░реНрдерди рдореЗрдВ рд╣реИрдВ ...

рдпрджрд┐ рдЖрдкрдХреЗ рд▓рд┐рдП Microsoft рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ Microsoft рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рдЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ https://play.golang.org/p/4ZPmV6Df3SD рдЬреИрд╕рд╛ рдХрд┐ @mattn рдиреЗ https://github.com/golang/go/issues/32088#issuecomment -493753714 рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ C рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рд╣реИред

Microsoft (R) C/C++ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд┐рдВрдЧ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдВрд╕реНрдХрд░рдг 19.16.27030.1 x64 рдХреЗ рд▓рд┐рдП
рдХреЙрдкреАрд░рд╛рдЗрдЯ (рд╕реА) рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреЙрд░реНрдкреЛрд░реЗрд╢рдиред рд╕рд░реНрд╡рд╛рдзрд┐рдХрд╛рд░ рд╕реБрд░рдХреНрд╖рд┐рддред

рдФрд░, рдЬрдм рдореИрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдЖрдиреЗ рддрдХ рдореИрдВ C:\Users\Alex\AppData\Local\Temp\a.txt рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛ рдирд╣реАрдВ рд╕рдХрддрд╛ рдерд╛ред

рдЗрд╕реА рддрд░рд╣ рдХреЗ рд╕реА # рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╕рд╛рде https://play.golang.org/p/SuM2iWYpZir рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛

рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ (рдЖрд░) рд╡рд┐рдЬреБрдЕрд▓ рд╕реА# рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдВрд╕реНрдХрд░рдг 2.10.0.0 (рдмреА9рдПрдлрдмреА1610)
рдХреЙрдкреАрд░рд╛рдЗрдЯ (рд╕реА) рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреЙрд░реНрдкреЛрд░реЗрд╢рдиред рд╕рд░реНрд╡рд╛рдзрд┐рдХрд╛рд░ рд╕реБрд░рдХреНрд╖рд┐рддред

рдЗрд╕реА рддрд░рд╣ рдпрд╣ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдо https://play.golang.org/p/6HgxePzEW_W рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдорд┐рдВрдЧрд╡ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдЬреАрд╕реАрд╕реА (x86_64-win32-seh-rev0, MinGW-W64 рдкреНрд░реЛрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд) 7.3.0
рдХреЙрдкреАрд░рд╛рдЗрдЯ (рд╕реА) 2017 рдлреНрд░реА рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдлрд╛рдЙрдВрдбреЗрд╢рди, рдЗрдВрдХред

рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рд░рдЦрддреЗ рд╣реИрдВред рддреЛ рдЙрди рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ FILE_SHARE_DELETE рдзреНрд╡рдЬ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИред

рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореБрдЭреЗ рдЙрд╕ рдмрджрд▓рд╛рд╡ рдХрд╛ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдореЗрд░рд╛ рдЧреЛ рдпреЛрдЧрджрд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЪрд▓ рд░рд╣реА рд╣реИ, рддрдм рднреА рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдпрджрд┐ рдХрд┐рд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЙрдирдХреА рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рд╕реЗрдЯ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдореЗрдВ рдЕрднреА рднреА рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреАред

рдПрд▓реЗрдХреНрд╕

рдХреНрдпрд╛ рдЖрдк Open() рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ FILE_SHARE_DELETE рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдЗрд░рд╛рджрд╛ os.Open рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ FILE_SHARE_DELETE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдпрд╣ https://golang.org/cl/194957 рдпреЛрдЬрдирд╛ рд╣реИред

рдПрд▓реЗрдХреНрд╕

рдореЗрд░реА рдореБрдЦреНрдп рдЪрд┐рдВрддрд╛ рд▓реЛрдЧреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рддреЛрдбрд╝рдиреЗ рдХреЛ рд▓реЗрдХрд░ рд╣реИ

рдЕрдм рддрдХ, рдХреЛрдИ рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдПрдХ рднреА рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧреЛ рдХреЗ рд╕рд╛рде рдЦреЛрд▓реА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ/рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЧреЛ рдРрдкреНрд╕ рдХреЛ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред

рдпрд╣рд╛рдВ рдЧреЛ 1.0 рд╕рдВрдЧрддрддрд╛ рд╡рд╛рджреЗ рдХрд╛ рдХреНрдпрд╛ рд╣реБрдЖ?

os.Rename() рдФрд░ .Remove() рдХреЗ рд▓рд┐рдП рдЧреЛ рдбреЙрдХреНрд╕ рдЗрд╕ рд╡рд┐рдВрдбреЛрдЬ рдлреАрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреБрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд╡рд┐рдВрдбреЛрдЬ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ 15 рдЙрд▓реНрд▓реЗрдЦ рд╣реИрдВред BTW, Go 2 рдиреЗ рднреЗрдЬ рджрд┐рдпрд╛ рд╣реИ: https://blog.golang.org/go2-here-we-come

рдЬреАрд╕реАрд╕реА (x86_64-win32-seh-rev0, MinGW-W64 рдкреНрд░реЛрдЬреЗрдХреНрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд) 7.3.0

рдЖрдк рдЬреАрд╕реАрд╕реА рдХреЗ рд╕рд╛рде рдХрд┐рд╕рдХреЗ рд╕реА-рд▓рд┐рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рд╢рд╛рдпрдж рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХрд╛? Mingw-w64 v6.0 рдкрд░ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ FILE_SHARE_VALID_FLAGS рдореЗрдВ FILE_SHARE_DELETE рд╢рд╛рдорд┐рд▓ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдкреБрди: рдкрд╛рдпрдерди рдХреЗ рдКрдкрд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрддреАрдд рдореЗрдВ рдПрдордПрд╕рд╡реАрд╕реА рд░рдирдЯрд╛рдЗрдо рдиреЗ рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдХреБрдЫ CreateFile() рдзреНрд╡рдЬ рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдерд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдПрдордПрд╕ рдиреЗ рдЕрдкрдирд╛ рд╕реА-рд▓рд┐рдм рдлреЙрдкреЗрди() рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред

рдореБрдЭреЗ рдЙрд╕ рдмрджрд▓рд╛рд╡ рдХрд╛ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

рдКрдкрд░ рдХрдИ рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рднреЛрдВ рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ; рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдкрд░ os.Rename() рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ред

рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рдХреНрдпреЛрдВрдХрд┐ рдЪрд░реНрдЪрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рд╣реЛ рд░рд╣реА рд╣реИред

рдЗрд╕ рдореБрджреНрджреЗ рдФрд░ рдЕрдм рддрдХ рдХреА рдЪрд░реНрдЪрд╛ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

  • рдпреВрдирд┐рдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░, рдпрджрд┐ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рддреА рд╣реИ, рддреЛ рджреВрд╕рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреА рд╣реИред рдореВрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреА рд╣реИ (рдЗрд╕рдХрд╛ рдЕрдм рдХреЛрдИ рдирд╛рдо рдирд╣реАрдВ рд╣реИ), рдЬрд┐рд╕рдореЗрдВ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдбрд┐рд╕реНрдХ рд╕реЗ рддрдм рддрдХ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рдЬрдм рддрдХ рдХрд┐ рдЕрдВрддрд┐рдо рдЦреБрд▓рд╛ рд╕рдВрджрд░реНрдн рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред

  • рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕рд┐рд╕реНрдЯрдо рдкрд░, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреА рд╣реИ, рддреЛ рджреВрд╕рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ _cannot_ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛ рджреЗрддреА рд╣реИред рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЦреБрд▓реА рди рд╣реЛред FILE_SHARE_DELETE рдзреНрд╡рдЬ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ: рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рднреА рдЦреБрд▓реЗ рд╕рдВрджрд░реНрдн FILE_SHARE_DELETE рдХреЗ рд╕рд╛рде рдЦреЛрд▓реЗ рдЧрдП рдереЗ, рддреЛ рджреВрд╕рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ DeleteFile рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреА рд╣реИ, рдФрд░ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рдлрд▓ рд╣реЛрдЧреАред

FILE_SHARE_DELETE рдХреЗ рд╕рд╛рде рд╡рд┐рдВрдбреЛрдЬрд╝ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрднреА рднреА рдпреВрдирд┐рдХреНрд╕ рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИред рдПрдордПрд╕рдбреАрдПрди рдкреЗрдЬ рдХрд╣рддрд╛ рд╣реИ:

DeleteFile рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдРрд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп I/O рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╣реИрдВрдбрд▓ рдЦреБрд▓реЗ рд╣реИрдВ рдпрд╛ рд╕реНрдореГрддрд┐-рдореИрдк рдХреА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ (FILE_SHARE_DELETE рдХреЛ рдЕрдиреНрдп рд╣реИрдВрдбрд▓ рдЦреЛрд▓реЗ рдЬрд╛рдиреЗ рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП)ред

DeleteFile рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛рдирд╛ рддрдм рддрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдВрддрд┐рдо рд╣реИрдВрдбрд▓ рдмрдВрдж рди рд╣реЛ рдЬрд╛рдПред рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП CreateFile рдХреЗ рдмрд╛рдж рдХреЗ рдХреЙрд▓ ERROR_ACCESS_DENIED рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

рдЕрд░реНрдерд╛рддреН, рдлрд╝рд╛рдЗрд▓ _name_ рдХреЛ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рддрдм рддрдХ рдирд╣реАрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рдЬрдм рддрдХ рдХрд┐ рдЦреБрд▓реЗ рд╕рдВрджрд░реНрдн рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗред рдпрд╣ рдпреВрдирд┐рдХреНрд╕ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдЬрд╣рд╛рдВ рдЦреБрд▓реЗ рд╕рдВрджрд░реНрдн рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдирд╛рдо рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЙрд╕реА рдирд╛рдо рдХреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдиреЗ рдХреА рддреИрдпрд╛рд░реА рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛ рд░рд╣реЗ рдереЗ, рдЬреЛ рдпреВрдирд┐рдХреНрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИ рд▓реЗрдХрд┐рди рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рдирд╣реАрдВ, FILE_SHARE_DELETE рдХреЗ рд╕рд╛рде рднреА рдирд╣реАрдВред

рдореВрд▓ рд╕реБрдЭрд╛рд╡ syscall рдХреЛ рдмрджрд▓рдирд╛ рдерд╛ред рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╣рдореЗрд╢рд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрд▓реЗрдВред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ syscall рдХреЛ рдХрд░реНрдиреЗрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдХрд░реАрдм рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕ рдзреНрд╡рдЬ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрдЧрд╣ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ os.Open / os.OpenFile рдХреЗ рджреМрд░рд╛рди рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

@alexbrainman рдиреЗ рддрд░реНрдХ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпреВрдирд┐рдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдЕрд▓рдЧ рд╣реИрдВ, рдЕрдЧрд░ рд╣рдо рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рднреА рд╡реЗ рдЕрд▓рдЧ рд░рд╣реЗрдВрдЧреЗ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдкреАрда рдХреЗ рдкреАрдЫреЗ рдпрд╣ рдмрджрд▓рд╛рд╡ рдХрд░рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рднреНрд░рдорд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХреЗ @jstarks рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рд╣рдореЗрдВ FILE_SHARE_DELETE рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдЧрд╛ рдФрд░ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХрд╛ "рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рд╕рдВрд╕реНрдХрд░рдг" (рдЕрд╕реНрдкрд╖реНрдЯ рдЬреЛ, рдпрд╛ рдпрджрд┐ рдЗрд╕реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) DeleteFile рд╕реЗ рд╡рд╛рдкрд╕реА рдкрд░ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдо рдХреЗ рдпреВрдирд┐рдХреНрд╕ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЛ рдЧрд╛рдпрдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DeleteFile рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рддреЛ рдЕрдЧрд░ рд╣рдордиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛, рддреЛ рдЙрд╕ рдирд╡реАрдирддрдо рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░, рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпреВрдирд┐рдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рд╡рд╣реА рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓реЗрдЧрд╛ред

@networkimprov рдХрд╛ рддрд░реНрдХ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдЯреВрдЯ рдЬрд╛рдПрдВрдЧреЗред

@alexbrainman рдЕрднреА рднреА рдЕрд╕рдВрдмрджреНрдз рд▓рдЧрддрд╛ рд╣реИред

@mattn рдиреЗ рдпрд╣ рднреА рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдзреНрд╡рдЬ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ (рдХрдо рд╕реЗ рдХрдо рдЬрдм рддрдХ рд╣рд░ рдХреЛрдИ рдирд╡реАрдирддрдо рд╡рд┐рдВрдбреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛) рдпрд╣ рдЕрднреА рднреА рдпреВрдирд┐рдХреНрд╕ рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдкреИрдХреЗрдЬ рдУрдПрд╕ рдПрдХ рдкреЛрд░реНрдЯреЗрдмрд▓ рдПрдкреАрдЖрдИ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде - рдзреНрд╡рдЬ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдЙрд╕рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХрдо рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ O_CLOEXEC (рдХреНрд▓реЛрдЬрд╝-рдСрди-рдПрдХреНрд╕реЗрдХ) рдореЗрдВ рдЕрдиреНрдп рдлрд╝реНрд▓реИрдЧреНрд╕ рднреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ os.Open рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ os.Open рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЯреВрдЯрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпреВрдирд┐рдХреНрд╕ рдкрд░ рднреА рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛, рд╣реИ рдирд╛?

рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬ рдУрдПрд╕ рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдареАрдХ рд░рд╣реЗрдЧрд╛ред рдЬреЛ рд▓реЛрдЧ рдзреНрд╡рдЬ рд╕реЗрдЯ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡реЗ рдЕрднреА рднреА рдкреИрдХреЗрдЬ syscall рдкрд░ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреЗ рд╣реИрдВред

@alexbrainman рдФрд░ @mattn , рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдордиреЗ рдзреНрд╡рдЬ рдХреЛ os.Open рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ (рдпрд╛ рд╕рдВрднрд╛рд╡рд┐рдд) рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдЯреВрдЯ рдЬрд╛рдПрдВрдЧреЗ? рдХреНрдпрд╛ рдпреВрдирд┐рдХреНрд╕ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рддреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛? рдзрдиреНрдпрд╡рд╛рджред

@rsc , рдЖрдкрдХреЗ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдкреИрдХреЗрдЬ "рдУрдПрд╕" рдореЗрдВ рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЗрд╕реЗ рдЕрдкрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ FILE_SHARE_DELETE рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ syscall.Open() рдзреНрд╡рдЬ рдкреВрд░реНрдгрддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрдкрдиреЗ рд╕рд╛рд░рд╛рдВрд╢ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рд╕реАрдорд╛рдПрдБ рдХреЛрдИ рдХрд╛рд░рдХ рдирд╣реАрдВ рд╣реИрдВ; рдкреНрд░рднрд╛рд╡ рдПрдХ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рднреАрддрд░ рд╕рдорд╛рди рд╣реИрдВред рдФрд░ рдзреНрд╡рдЬ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ; рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдпрд╣ рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛рдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд рддреБрд░рдВрдд рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред (рдФрд░ рдпрд╣ рд╣рдЯрд╛рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣рд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред)

рдзрдиреНрдпрд╡рд╛рдж @networkimprovред рд╣рд╛рдВ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реАрдорд╛рдПрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИрдВ; рдпрд╣ рд╕рд┐рд░реНрдл рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╢реАрд░реНрд╖рдХ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрдВрдХ рдкрд╛рда рдореЗрдВ рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рд╣реИ:

a) os.Create/Open/OpenFile() рдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╣рдореЗрд╢рд╛ file_share_delete рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП,
рдмреА) рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ syscall.Open() рдХреЛ рдПрдХ рдзреНрд╡рдЬ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ file_share_delete рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░
рд╕реА) рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╕рд┐рд╕реНрдХрд▓ рдХреЛ рдирдП рдзреНрд╡рдЬ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

os.Remove() рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдПрдХ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: os.Rename(path, unique_path); os.Remove(unique_path) ред

рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЧреЛ рдХреЗ os.Open рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрдирдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдРрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЧреЛ рдРрдкреНрд╕ рдХреЛ рддреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред

рдпрд╣ рдХреНрдпрд╛ рд╣реИрдВ? рдЗрд╢реНрдпреВ рдирдВрдмрд░ рдХреНрдпрд╛ рд╣реИрдВ? рдФрд░ break рд╢рдмреНрдж рд╕реЗ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рд╡реЗ рдХрдм рдЯреВрдЯ рдЧрдП?

рдЖрдк рдЬреАрд╕реАрд╕реА рдХреЗ рд╕рд╛рде рдХрд┐рд╕рдХреЗ рд╕реА-рд▓рд┐рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рд╢рд╛рдпрдж рдорд╛рдЗрдХреНрд░реЛрд╕реЙрдлреНрдЯ рдХрд╛? Mingw-w64 v6.0 рдкрд░ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ FILE_SHARE_VALID_FLAGS рдореЗрдВ FILE_SHARE_DELETE рд╢рд╛рдорд┐рд▓ рд╣реИред

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ x86_64-7.3.0-release-win32-seh-rt_v5-rev0.7z рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рдЧреВрдЧрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг 7.3 рдХрд╛ рд╣реИред

рдореБрдЭреЗ рдЙрд╕ рдмрджрд▓рд╛рд╡ рдХрд╛ рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИред

рд▓рд╛рднреЛрдВ рдХреЛ рдКрдкрд░ рдмрд╛рд░-рдмрд╛рд░ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ,...

рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдЙрджреНрдзрд░рдг рдореЗрдВ рд╕реЗ personally рд╢рдмреНрдж рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЕрдкрдиреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдЗрд╕рдореЗрдВ рдореЗрд░рд╛ рдЧреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдпреЛрдЧрджрд╛рди рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред

рдЗрд╕ рдореБрджреНрджреЗ рдФрд░ рдЕрдм рддрдХ рдХреА рдЪрд░реНрдЪрд╛ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

рдЖрдкрдиреЗ рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ Microsoft рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдлрд╝реНрд▓реИрдЧ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ https://github.com/golang/go/issues/32088#issuecomment -531713562

рдЖрдкрдиреЗ рдЧреЛ 1 рд╕рдВрдЧрддрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рдХреЛ рднреА рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛

рдпрд╣рд╛рдВ рдЧреЛ 1.0 рд╕рдВрдЧрддрддрд╛ рд╡рд╛рджреЗ рдХрд╛ рдХреНрдпрд╛ рд╣реБрдЖ? рдЬрд╣рд╛рдВ https://golang.org/doc/go1compat рдореЗрдВ рдпрд╣ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдХрд┐ рдпрджрд┐ рдЖрдк go-nuts рдкрд░ рдЕрдкрдиреЗ рдЗрд░рд╛рджреЗ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЦреБрд▓реЗ рдлрд╝рд╛рдЗрд▓ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдареАрдХ рд╣реИ?

рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЧреЛ 1.0 рд╕рдВрдЧрддрддрд╛ рд╡рд╛рджреЗ рдореЗрдВ рдХреИрд╕реЗ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ?

рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рдкреИрдХреЗрдЬ рдУрдПрд╕ рдПрдХ рдкреЛрд░реНрдЯреЗрдмрд▓ рдПрдкреАрдЖрдИ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде - рдзреНрд╡рдЬ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рд╕реЗ рдЙрд╕рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд▓реЛрдЧреЛрдВ рдХреЛ рдпреВрдирд┐рдХреНрд╕ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдХреАрдордд рдкрд░ред рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд┐рдВрдбреЛрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдХреЛрдИ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпрд╛ рдЯреВрд▓ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдпрдж рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рдирд╣реАрдВред

рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдпреВрдирд┐рдХреНрд╕ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЖрдИрдПрдордПрдЪрдУ рдмрд╣реБрдд рдЦрд░рд╛рдм рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рд╕реЗ We still won't be able to delete executable files while process is running. We will still have problems deleting directories if any process have their current directories set there. рднрд╛рдЧ рджреЗрдЦреЗрдВ https://github.com/golang/go/issues/32088#issuecomment -531713562

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХрдо рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ O_CLOEXEC (рдХреНрд▓реЛрдЬрд╝-рдСрди-рдПрдХреНрд╕реЗрдХ) рдореЗрдВ рдЕрдиреНрдп рдлрд╝реНрд▓реИрдЧреНрд╕ рднреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ os.Open рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ os.Open рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЯреВрдЯрдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпреВрдирд┐рдХреНрд╕ рдкрд░ рднреА рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛, рд╣реИ рдирд╛?

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ O_CLOEXEC рдХрд╛ рдЕрд░реНрде рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓ рдХреЛ рдмрд╛рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рднрд╛рдЧрдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рд╣реИред рдФрд░ O_CLOEXEC рд╣рдореЗрд╢рд╛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ os.Open рдореЗрдВ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИред рддреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЪрд╛рдЗрд▓реНрдб рдкреНрд░реЛрд╕реЗрд╕ рджреНрд╡рд╛рд░рд╛ os.Open рдХреЗ рд╕рд╛рде рдХреЛрдИ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдЦреЛрд▓реА рдЬрд╛ рд╕рдХрддреА рд╣реИред рддреЛ рдХреНрдпрд╛? рдпрд╣ рд╡рд╛рдЬрд┐рдм рд▓рдЧрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпреВрдирд┐рдХреНрд╕ рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рддреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛?

рдореИрдВ рдЖрдкрдХрд╛ рдкреНрд░рд╢реНрди рдирд╣реАрдВ рд╕рдордЭрддрд╛ред

рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ (рдпрд╛ рд╕рдВрднрд╛рд╡рд┐рдд) рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдЯреВрдЯ рдЬрд╛рдПрдВрдЧреЗ?

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛, рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдРрд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИрдВред рдХрд╣рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИрдВред рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╕реЗрд╡рд╛ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреА рд╣реИ, рдорд╛рди рд▓реЗрдВ рдХрд┐ c:\mysvc.txt , рдФрд░ рдЗрд╕реЗ рдЦреБрд▓рд╛ рд░рдЦрддрд╛ рд╣реИред рдПрдХ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдЬреЛ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рдЬреАрд╡рд┐рдд рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рд╕реЗрд╡рд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВред рдпрд╣ рдПрдХ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗрд╡рд▓ рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ c:\mysvc.txt рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░, рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдЪрд▓реА рдЧрдИ рд╣реИ, рддреЛ рдпрд╣ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдорд╛рди рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕реЗрд╡рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдХреБрдЫ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдирдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдпрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - https://stackoverflow.com/questions/11318663/prevent-a-user-from-deleting-moving-or-renameing-a-file

рдПрд▓реЗрдХреНрд╕

рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЧреЛ рдХрд╛ рдбреЗрдЯрд╛ рдмрд┐рдВрджреБ рдкреБрди: рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
Win8 7 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╢рд┐рдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
Win8+ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрд╕ рдЧреЛ рдмрдЧ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рд╕рд┐рд░реНрдл 5 рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рдХреА рдЧрдИ рдереА: #31528

@rsc рдХреЛрдИ рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЬреЛ рдЧреЛ рдХреЗ рд╕рд╛рде рдЦреЛрд▓реА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ/рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдпреВрдирд┐рдХреНрд╕ рдкрд░ рдЯреВрдЯрд╛ рд╣реБрдЖ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрд▓реЗрдХреНрд╕ рдХрд╛ c:\mysvc.txt рдкрд░рд┐рджреГрд╢реНрдпред

рдпрджрд┐ рдХреЛрдИ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд▓рд┐рдирдХреНрд╕/рдЖрджрд┐ (рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд) рдкрд░ рддреИрдирд╛рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрдЧ рдХрд╛ рд╕реНрд░реЛрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╣рдорд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд▓реЙрдЧрд░ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИред
рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рд░реЛрдЯреЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рд▓рд┐рдЦреЗрдВ рдпрджрд┐ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓> рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рд╣реИ рддреЛ рдШреБрдорд╛рдПрдВ)ред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╛рдардХ рднреА рд╣реИрдВ рдЬреЛ рдЗрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреЛрд▓реЗрдВрдЧреЗ рдФрд░ рдкрдврд╝рддреЗ рд╕рдордп рдЙрдиреНрд╣реЗрдВ рдЦреБрд▓рд╛ рд░рдЦреЗрдВрдЧреЗред

FILE_SHARE_DELETE рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рдмрд┐рдирд╛ рд╣рдо рд╕рдХреНрд░рд┐рдп рдкрд╛рдардХ рд╣реЛрдиреЗ рдкрд░ рд░реЛрдЯреЗрд╢рди (рдирд╛рдо рдмрджрд▓реЗрдВ рдФрд░/рдпрд╛ рд╣рдЯрд╛рдПрдВ) рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@mattn :

рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЧреЛ рдХреЗ os.Open рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЗрдирдХрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреВрдирд┐рдХреНрд╕ рдкрд░ рд╡реИрд╕реЗ рднреА рдРрд╕рд╛ рдХреЛрдб рдЧрд▓рдд рд╣реИред рдкреИрдХреЗрдЬ рдУрдПрд╕ рдПрдХ рдкреЛрд░реНрдЯреЗрдмрд▓ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рд╕рд╛рде рд╣реА рд╣рдо рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ _actual_ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдЕрдзрд┐рдХ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред

@alexbrainman :

рдЖрдкрдиреЗ рдпрд╣ рдирд╣реАрдВ рдХрд╣рд╛ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ Microsoft рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдлрд╝реНрд▓реИрдЧ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдореЗрд░реА рдЯрд┐рдкреНрдкрдгреА рджреЗрдЦреЗрдВ #32088 (рдЯрд┐рдкреНрдкрдгреА)

рд╣рд╛рдБ рд▓реЗрдХрд┐рди рд╡рд╣ рд╕реА рд╣реИ; рд╣рдо рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЧреЛ рдХреАред рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕реА рдПрдкреАрдЖрдИ рдХреА рдирдХрд▓ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рдкреИрдХреЗрдЬ рдУрдПрд╕ рдореЗрдВ рдЕрдзрд┐рдХрддрд░ рдкреЛрд░реНрдЯреЗрдмрд▓ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред O_CLOEXEC рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдпрд╣ рдереА рдХрд┐ рдпреВрдирд┐рдХреНрд╕ рд╕рд┐рд╕реНрдЯрдо рдкрд░ os.Open O_CLOEXEC рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдпрд╣ рд╕рдВрдмрдВрдзрд┐рдд C рдХреЙрд▓ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рди рд╣реЛред рд╣рдо _do_ рдЙрдкрдпреЛрдЧреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рднреА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдЧреЛ 1 рд╕рдВрдЧрддрддрд╛ рд╣реИ, рдЕрдиреНрдп рдУрдПрд╕ рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдУрдПрд╕ рдкрд░ рдПрдХ рдХреЛрдиреЗ-рдХреЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред рд╣рдо рд╕рднреА рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреНрд░реЙрд╕-рд╕рд┐рд╕реНрдЯрдо рдЕрд╕рдВрдЧрддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╡рд┐рдВрдбреЛрдЬрд╝ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЬреЛ рд╡рд┐рдВрдбреЛ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдЬреЛрд░ рджреЗрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рдкрд╛рд╕ рд╣рдореЗрд╢рд╛ рдкреИрдХреЗрдЬ рд╕рд┐рд╕реНрдХрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░реЗрдЧрд╛ рдХрд┐ рдЬрд┐рд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рддрдХ рдкрд╣реБрдВрдЪрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рджреЛрдмрд╛рд░рд╛, рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдЯреВрдЯ рдЬрд╛рдПрдВрдЧреЗ?

@ cpuguy83 , рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рд╕рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреАред

@rsc рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдЕрднреА рддрдХ FILE_SHARE_DELETE рдХреЗ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкреНрд░рднрд╛рд╡реЛрдВ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣, рдХреЛрдИ рдкреБрд╖реНрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓реА рд╣реИ рдХрд┐ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рд▓реЙрдЧрд░реЛрдЯреЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдмрд╛рд░ рдЬрдм рдЧреЛ рдореЗрдВ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рд╢рд╛рдорд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛, рднрд▓реЗ рд╣реА рдЧреЛ рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рд▓реЙрдЧрд░реЛрдЯреЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдзреНрдпрд╛рди рд╕реЗ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ред рдореВрд▓ рд░реВрдк рд╕реЗ, Windows рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛ рд╕рдХрддрд╛ рдЬрд┐рдиреНрд╣реЗрдВ FILE_SHARE_DELETE рдХреЗ рд╕рд╛рде рдлрд╝реНрд▓реИрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЧреЛ рдХреЛ рдХрд┐рд╕реА рднреА рдлрд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣реИрдВрдбрд▓ рдХреЗ рд╕рд╛рде os.NewFile рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓реЗрдВ os.File рд╕рдВрд░рдЪрдирд╛ рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рднрд▓реЗ рд╣реА рдпрд╣ рдлрд╝реНрд▓реИрдЧ рд╕реЗрдЯ рди рд╣реЛред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рдПрдХ рддрдВрддреНрд░ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ FILE_SHARE_DELETE рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рдмрдЬрд╛рдп os.OpenFile рдХреЗ рд▓рд┐рдП рдзреНрд╡рдЬ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдУрдПрд╕ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рдБ рд▓реЗрдХрд┐рди рд╡рд╣ рд╕реА рд╣реИ; рд╣рдо рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЧреЛ рдХреАред

рдФрд░ рд╕реА # рднреАред рдореИрдВрдиреЗ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдХреЛрдИ рдЕрдиреНрдп рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдЧреЛ 1 рд╕рдВрдЧрддрддрд╛ рд╣реИ, рдЕрдиреНрдп рдУрдПрд╕ рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдУрдПрд╕ рдкрд░ рдПрдХ рдХреЛрдиреЗ-рдХреЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдареАрдХ рд▓рдЧрддрд╛ рд╣реИред

рдпрд╣ рдЧреИрд░ рд╡рд┐рдВрдбреЛрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд░реНрдирд░-рдХреЗрд╕ рд╣реИред рд╡рд┐рдВрдбреЛрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдорд╛рдирдХ рд╣реИред

рджреЛрдмрд╛рд░рд╛, рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рдЯреВрдЯ рдЬрд╛рдПрдВрдЧреЗ?

рдХрдВрдХреНрд░реАрдЯ рдХреЗ рдКрдкрд░ рдореЗрд░реЗ рд╕реЗрд╡рд╛ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред

@ cpuguy83 , рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рд╕рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреАред

@ cpuguy83 рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░

рдореВрд▓ рд░реВрдк рд╕реЗ, Windows рдЙрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдирд╣реАрдВ рд╣рдЯрд╛ рд╕рдХрддрд╛ рдЬрд┐рдиреНрд╣реЗрдВ FILE_SHARE_DELETE рдХреЗ рд╕рд╛рде рдлрд╝реНрд▓реИрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЧреЛ рдХреЛ рдХрд┐рд╕реА рднреА рдлрд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИред рдХреЗрд╡рд▓ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЦреЛрд▓реА рдЧрдИ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╣реА рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдиреЙрди рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЦреЛрд▓реА рдЧрдИ рдЕрдиреНрдп рд╕рднреА рдлрд╛рдЗрд▓реЗрдВ рдЕрднреА рднреА рд╣рдЯрд╛рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд░рд╣реЗрдВрдЧреАред рд╡рд╣ рдУрдПрд╕ рдмрдирд╛ рджреЗрдЧрд╛ред рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣рдЯрд╛ рджреЗрдВ - рдХрднреА-рдХрднреА рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдФрд░ рдХрднреА-рдХрднреА рдпрд╣ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдПрд▓реЗрдХреНрд╕

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреИрдЪ рдХрд┐рдП рдЧрдП syscall.Open() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рд╣реИ рдЬреЛ рдЦреБрд▓реА рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдЖрдк рд▓реЙрдЧ рд░реЛрдЯреЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ; рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИрдВред

// several processes or goroutines do this
   fd, err := os.OpenFile("log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, ...)
   _, err = fd.Write(log_entry) // one or more times
   err = fd.Close()

// log rotator process does this
   err := os.Rename("log", "log_old") // active writers not disturbed
   fmt.Println(err) // "sharing violation" without FILE_SHARE_DELETE

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рдереА :-/

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ os.NewFile() рд╕реЗ os.File рдореЗрдВ os.Create/Open/OpenFile() рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧреБрдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред

рдЖрдк рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ Microsoft C fopen() рд╡реНрдпрд╡рд╣рд╛рд░ Windows рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ; рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдХреЛрдИ CreateFile() рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рд╛рдЭрд╛рдХрд░рдг рдореЛрдб рдирд╣реАрдВ рд╣реИ; рдпрд╣ FILE_SHARE_READ | FILE_SHARE_WRITE ред

рдЖрдк рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рд╡рд┐рдВрдбреЛрдЬ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ __рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдиреНрдп рд╡рд┐рдХреНрд░реЗрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛__ рд╣рдореЗрд╢рд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдлрд╛рдЗрд▓реЗрдВ рдЦреЛрд▓рддреЗ рд╣реИрдВред рдЕрдЧрд░ рдРрд╕рд╛ рд╣реЛрддрд╛, рддреЛ Microsoft рд╣рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ file_share_delete рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд╣рддрд╛ред

@networkimprov

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рдереА :-/

рдореИрдВ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЙрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓ рд╕рдХрддреА рд╣реИред

рдореИрдВ рдЬреЛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ: рдЙрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдЧреЛ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрддреА рд╣реИ, рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд▓реЙрдЧрд░реЛрдЯреЗрдЯ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@alexbrainman

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдХреЛрдб рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЛрдб рд╣реИ: https://github.com/moby/moby/blob/master/daemon/logger/loggerutils/logfile.go

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╢рдорди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдлреЛрд░реНрдХ os.OpenFile рдФрд░ syscall.Open: https://github.com/moby/moby/pull/39974/files рдХреЗ рд▓рд┐рдП рд╣реИ

рд╕реНрдкрд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, OpenFile рд╕реЗ FILE_SHARE_DELETE рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ syscall.Open рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдХреЛрдб рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреЛрдб рд╣реИ: https://github.com/moby/moby/blob/master/daemon/logger/loggerutils/logfile.go

рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╢рдорди рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЗрд╡рд▓ рдлреЛрд░реНрдХ os.OpenFile рдФрд░ syscall.Open: https://github.com/moby/moby/pull/39974/files рдХреЗ рд▓рд┐рдП рд╣реИ

@ cpuguy83 рд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЗрд╕ рдкрд░ рдореЗрд░реА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирдЬрд╝рд░ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореБрджреНрджрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред рдореБрдЭреЗ рд░реЗрдкреНрд░реЛ (рд╢рд╛рдпрдж рдпрд╣ https://github.com/moby/moby/issues/39274#issuecomment-497966709 ) рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕реЗ рд╡рд╣рд╛рдВ рд╕реЗ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдкрд░ рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдХрдм рд╣реЛрдЧрд╛ред рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмреЗрд╣рддрд░ рд╕реБрдЭрд╛рд╡ рд╣реИ рддреЛ рдореЗрд░реА рдпреЛрдЬрдирд╛, рдореБрдЭреЗ рдмрддрд╛рдПрдВред

рдПрд▓реЗрдХреНрд╕

рдиреАрдЪреЗ рдорд╛рдирдХ-рдЕрднреНрдпрд╛рд╕ рд▓реЙрдЧ рд░реЛрдЯреЗрд╢рди рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдбреЗрдореЛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╣рд░ рдмрд╛рд░ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдкрд░ 100 рдЧреЛрд░рдЖрдЙрдЯ рдкреНрд░рддреНрдпреЗрдХ рд▓реЙрдЧрд┐рдВрдЧ 50 рд▓рд╛рдЗрдиреЗрдВ 0.1-2рд╕реЗрдХрдВрдб рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рд╣реЛрддреА рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдЧреЛрд░реМрдЯрд╛рдЗрди рд▓реЙрдЧ рдХреЛ 1 рдорд┐рдирдЯ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдШреБрдорд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдХрд▓ рдЗрд╕реЗ рдХрдИ рдШрдВрдЯреЛрдВ рддрдХ Win7 рд▓реИрдкрдЯреЙрдк рдкрд░ рд╢реВрдиреНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдпрд╛ред

рдЗрд╕реЗ syscall.Open() рдХреЗ рдкреИрдЪ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ FILE_SHARE_DELETE рдХреЛ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ; рдпрд╣ рдЕрдиреНрдпрдерд╛ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рдмрд┐рдирд╛ рдХреЛрдИ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд▓реЙрдЧрд┐рдВрдЧ рдпреЛрдЬрдирд╛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХрдИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рднреА рд╣реИрдВ; рдореЗрд░рд╛ рдЕрдкрдирд╛ рдХреЛрдб рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЦреБрд▓реА рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рддрд╛ рд╣реИред

@rsc , рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рдорд╛рдорд▓реЗ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдЕрдЧрд░ рдЕрднреА рднреА рдХреЛрдИ рд╕рдВрджреЗрд╣ рдерд╛ред (рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореИрдВрдиреЗ рдЧреЛрд▓рдВрдЧ-рджреЗрд╡ рдФрд░ рдЧреЛрд▓рдВрдЧ-рдирдЯреНрд╕ рдореЗрдВ рдмрд╛рд░-рдмрд╛рд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЙрди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд░рд╣рд╛ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ, рд╢реВрдиреНрдп рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рдеред)

package main

import (
   "fmt"
   "os"
   "math/rand"
   "syscall"
   "time"
)

const kLogFile = "winrotate"

func main() {
   syscall.Open_FileShareDelete = true
   rand.Seed(time.Now().UnixNano())

   for a := 0; a < 100; a++ {
      go runLog()
   }

   fmt.Println("rotating to "+ kLogFile +"N.txt")
   for a := 0; true; a++ {
      if a >= 5 {
         a = 0
      }
      time.Sleep(60 * time.Second)
      err := os.Rename(kLogFile +".txt", kLogFile + string('0'+a) +".txt")
      if err != nil {
         fmt.Println(err)
         os.Exit(1)
      }
   }
}

const kLineVal = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

func runLog() {
   aLine := make([]byte, 102)
   for {
      aFd, err := os.OpenFile(kLogFile +".txt", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0600)
      if err != nil {
         fmt.Println(err)
         return
      }
      for _, aV := range kLineVal {
         for a := range aLine {
            aLine[a] = byte(aV)
         }
         aEnd := aV - ('z' - 100) // limit line len to 100
         copy(aLine[aEnd:], []byte{'\r','\n'})
         _, err = aFd.Write(aLine[:aEnd + 2])
         if err != nil {
            fmt.Println(err)
            return
         }
         time.Sleep(time.Duration(100 + rand.Intn(1900)) * time.Millisecond)
      }
      err = aFd.Close()
      if err != nil {
         fmt.Println(err)
         return
      }
   }
}

syscall_windows.go рдкрд░ рдкреИрдЪ рдХрд░реЗрдВ:

diff --git a/src/syscall/syscall_windows.go b/src/syscall/syscall_windows.go
index de05840..e1455d5 100644
--- a/src/syscall/syscall_windows.go
+++ b/src/syscall/syscall_windows.go
@@ -245,6 +245,8 @@ func makeInheritSa() *SecurityAttributes {
    return &sa
 }

+var Open_FileShareDelete = false
+
 func Open(path string, mode int, perm uint32) (fd Handle, err error) {
    if len(path) == 0 {
        return InvalidHandle, ERROR_FILE_NOT_FOUND
@@ -270,6 +272,9 @@ func Open(path string, mode int, perm uint32) (fd Handle, err error) {
        access |= FILE_APPEND_DATA
    }
    sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE)
+   if Open_FileShareDelete {
+       sharemode |= FILE_SHARE_DELETE
+   }
    var sa *SecurityAttributes
    if mode&O_CLOEXEC == 0 {
        sa = makeInheritSa()

@networkimprov рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдЙрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рдЕрдиреНрдп рддрд░реАрдХреЗ рднреА рд╣реИрдВред

https://github.com/mattn/go-sizewriter/blob/master/_example/example.go#L14

рдиреАрдЪреЗ рдорд╛рдирдХ-рдЕрднреНрдпрд╛рд╕ рд▓реЙрдЧ рд░реЛрдЯреЗрд╢рди рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдбреЗрдореЛ рд╣реИ

рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, @networkimprov ред рдореИрдВ рдЕрдм рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐, рдпрджрд┐ рдХреЛрдИ рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ FILE_SHARE_DELETE рдХреЗ рдмрд┐рдирд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреА рдЬрд╛ рд░рд╣реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреЛрд▓ рджреЗрдЧреА, рддреЛ рдЖрдкрдХреЛ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА рдЬреЛ рдЕрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдо рдЧреЛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВред

@ cpuguy83 рдореИрдВ рдЖрдкрдХреЗ рдореБрджреНрджреЗ рдХреЛ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣рд╛рдБ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ https://github.com/golang/go/issues/32088#issuecomment-536233195), рдХреНрдпреЛрдВрдХрд┐ @networkimprov рдЙрджрд╛рд╣рд░рдг рдореБрдЭреЗ рдПрдХ рддрд╕реНрд╡реАрд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдПрд▓реЗрдХреНрд╕

рдПрд▓реЗрдХреНрд╕, рдпрджрд┐ рдмрд╛рд╣рд░реА рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рддреЛ рдХреЛрдИ рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд▓реВрдк рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рд╕рдХреНрд░рд┐рдп рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдирд╣реАрдВред

рдореИрдЯрди, рд░реЛрдЯреЗрдЯ рдХрд╛ рдирд╛рдо рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рд╣реИред рдпреВрдирд┐рдХреНрд╕ рдкреГрд╖реНрдарднреВрдорд┐ рд╡рд╛рд▓реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рджреЛ рд╕рдмрд╕реЗ рд╕рдХреНрд░рд┐рдп рд╡рд┐рдВрдбреЛрдЬ рдбреЗрд╡рд▓рдкрд░реНрд╕ ( @alexbranman рдФрд░ @mattn ) рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдПрдХреАрдХреГрдд рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ FILE_SHARE_DELETE рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдпреВрдирд┐рдХреНрд╕ рдЬреИрд╕рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред

рдпрд╣ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдирдпрд╛ рдзреНрд╡рдЬ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рддрдирд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдХреНрдпрд╛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЧрдИ рд╣реИрдВред рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рдкрд░ рдкреБрдирд░реНрд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рд╕рд╛рд▓ рдпрд╛ рдЙрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдореЗрдВ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рджрд░реНрдЬ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдареАрдХ рд╣реЛрдЧрд╛ред

рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдо рд╕рд╣рдорддрд┐ рдХреА рдХрдореА рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рдЧрд┐рд░рд╛рд╡рдЯ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдЕрдВрддрд┐рдо рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реИред

рдХреНрдпрд╛ рдХреЗрд╡рд▓ рд╡рд┐рдХрд▓реНрдк рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдкрд░ рд╡рд┐рд╡рд╛рдж рд╣реИ?

рдЕрдЧрд░ рд╣рдо рдЖрд╡рд╛рдЬрд╝ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЖрд╡рд╛рдЬрд╝реЗрдВ рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ _something_ рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдБред рдЕрднреА, рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рдЧреЛ рдХреА рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реИ, рдПрдХ рдкрдВрдХреНрддрд┐ рдмрджрд▓рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрд╕ рдХрд╛рдВрдЯреЗ рдХреЛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рд░рдЦрдирд╛ рд╣реИред рд▓реЙрдЧ рдореЙрдирд┐рдЯрд░ рдпрд╛ рд▓рд╛рдЗрд╡ "рдЯреЗрд▓" рдХрд╛ рд╣рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдВрддрддрдГ рдРрд╕рд╛ рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ https://github.com/elastic/beats/blob/master/libbeat/common/file/file_windows.go#L85 -L103

рдЕрдЧрд░ рдореИрдВрдиреЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд╛рд▓рди рдХрд┐рдпрд╛, рддреЛ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реИрдВ:

  1. рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╕рдордп рдлрд╝реНрд▓реИрдЧ FILE_SHARE_DELETE рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ -
    рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЖрд╕рд╛рди рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдбреЗрд╡рд▓рдкрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛
    рдирдИ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╕рдордп рдЗрд╕ рдореЛрдб рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ
  2. рдЗрд╕ рдлрд╝реНрд▓реИрдЧ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪрд╛рд▓реВ рдХрд░реЗрдВ - рдЬреЛрдЦрд┐рдо рднрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
    рдЕрдВрддрд┐рдо рд╡рд┐рдВрдбреЛрдЬрд╝ 10 рдмрд┐рд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордпред

рдпрджрд┐ рд╕рднреА 1 рдкрд░ рд╕рд╣рдордд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╢рд╛рдпрдж рд╣рдо рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд╕рдордп рдзреНрд╡рдЬ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ
рдЕрднреА рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ, рдФрд░ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ 2 рдкрд░ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдПрдВред

рдмреБрдз рдкрд░, 2 рдЕрдХреНрдЯреВрдмрд░ 2019, 19:32 рдорд╛рд░реНрдХ рджрд╛рд╕рдЪрд░, рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдЕрдЧрд░ рд╣рдо рдЖрд╡рд╛рдЬ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЖрд╡рд╛рдЬреЗрдВ рдвреВрдВрдв рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реВрдВ
рдХреБрдЫ рдХрд░рдиреЗ рдХрд╛ ред рдЕрднреА, рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЙрдкрд╛рдп рд╣реИ рдХрд┐ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ a . рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
рдЧреЛ рдХреЗ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдХреЛрдб рдХрд╛ рдЧреБрдЪреНрдЫрд╛, рдПрдХ рдкрдВрдХреНрддрд┐ рдмрджрд▓реЗрдВ, рдФрд░ рдлрд┐рд░
рдЙрд╕ рдХрд╛рдВрдЯреЗ рдХреЛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рд░рдЦрдирд╛ред рд▓реЙрдЧ рдореЙрдирд┐рдЯрд░ рдпрд╛ рд▓рд╛рдЗрд╡ рдХрд╛ рд╣рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
"рдкреВрдВрдЫ" рдЕрдВрддрддрдГ рдРрд╕рд╛ рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ
https://github.com/elastic/beats/blob/master/libbeat/common/file/file_windows.go#L85 -L103

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/32088?email_source=notifications&email_token=ABNEY4VFQLSYVI66ENT6G4LQMTLJ7A5CNFSM4HNPNYIKYY3PNVWWK3TUL52HS4DFVREXGEAVMVBW63 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/ABNEY4U5L3WFZYNIUOSY2TQMTLJ7ANCNFSM4HNPNYIA
.

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ _at рдХрдо рд╕реЗ рдХрдо рдХреЗ рдкрдХреНрд╖ рдореЗрдВ 1. (рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╕рдордп FILE_SHARE_DELETE рдзреНрд╡рдЬ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ)

рдмрд╕ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдкрд░ рдлрд┐рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЕрдиреБрд╡рд░реНрддреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП :

syscall.FILE_SHARE_DELETE рдзреНрд╡рдЬ os.OpenFile рдХреЗ flag рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рдлрд┐рдЯ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдСрди-рдбрд┐рдорд╛рдВрдб рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдХрд┐рд╕реА рдЕрдиреНрдп os.O_* рдЭрдВрдбреЗ рд╕реЗ рдЯрдХрд░рд╛рддрд╛ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдЗрд╕реЗ рд▓рд╛рдЧреВ/рдЗрдВрдЬреАрдирд┐рдпрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдФрд░ рдпрд╣ рд╕рд┐рд╕реНрдЯрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмреЗрд╡рдХреВрдл рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ ( os ) рдкреЙрдЬрд╝рд┐рдХреНрд╕-рдУрд░рд┐рдПрдВрдЯреЗрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рдпрд╣ рд╡рд╣реА рдорд╛рд░реНрдЧ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА POSIX рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рд╕рд┐рд╕реНрдЯрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдкрд░ syscall.O_DIRECTORY )ред

рднрд▓реЗ рд╣реА рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪрд╛рд▓реВ рди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ (рдЬреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рд╣реА рдХреЙрд▓ рд╣реИ), рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдзреНрд╡рдЬ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ (рдЬрд┐рдирдореЗрдВ @networkimprov рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ) рдФрд░ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рд╣реЛрдирд╛ CreateFileW рдХреЙрд▓ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рдФрд░ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдоред

рдХреГрдкрдпрд╛ рдКрдкрд░ рджрд┐рдП рдЧрдП рд╡рд┐рдХрд▓реНрдк [1] рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ FILE_SHARE_DELETE рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рджреЗрддрд╛ рд╣реИ рдФрд░ рдЧреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛрдб рдХреЗ рдХрд╛рдВрдЯреЗрджрд╛рд░ рднрд╛рдЧ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред

__Rust__ рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рдзреНрд╡рдЬ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА FILE_SHARE_* рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ _рд╕реНрд╡рд┐рдЪ рдСрдл_ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
https://doc.rust-lang.org/std/os/windows/fs/trait.OpenOptionsExt.html

@rsc рдХреНрдпрд╛ рдореИрдВ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЦрд┐рд▓рд╛рдл рджрд┐рдП рдЧрдП рддрдХрдиреАрдХреА рддрд░реНрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рдЦрдВрдбрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?

@networkimprov рдкреВрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд░ рдЪрд░реНрдЪрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдФрд░ ossyscall рдкреИрдХреЗрдЬ рдореЗрдВ рдирдИ рд╡рд┐рдВрдбреЛрдЬрд╝ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдзреНрд╡рдЬ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдирдпрд╛ рдореБрджреНрджрд╛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдирдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдСрдкреНрдЯ-рдЖрдЙрдЯ рдХреЗ рдмрдЬрд╛рдп рдСрдкреНрдЯ-рдЗрди рд╣реИред рд╡рд░реНрддрдорд╛рди рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдмрджрд▓рдирд╛ рд╣реИ, рдЬреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдЪрд┐рдВрддрд┐рдд рдХрд░рддрд╛ рд╣реИред

@rsc рдХреНрдпрд╛ рдореИрдВ рдкреВрдЫ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдЦрд┐рд▓рд╛рдл рджрд┐рдП рдЧрдП рддрдХрдиреАрдХреА рддрд░реНрдХреЛрдВ рдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рдЦрдВрдбрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛?

рдореБрдЭреЗ рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рддрд░реНрдХреЛрдВ рдХрд╛ "рдЦрдВрдбрди" рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред "рдкреНрд░рд╕реНрддрд╛рд╡ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд▓рдХреНрд╖реНрдп рд╕рдордп рдкрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдо рд╕рд╣рдорддрд┐ рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рд╣реИред" рдпрд╣рд╛рдВ рдЖрдЧреЗ рдХреЗ рд░рд╛рд╕реНрддреЗ рдХреЛ рд▓реЗрдХрд░ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рд╣реИред рддрдХрдиреАрдХреА рддрд░реНрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рдкреНрд░рдореБрдЦ рдЧреЛ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдордирд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд╡рд┐рдВрдбреЛрдЬ рдкреЛрд░реНрдЯ (рдЕрд░реНрдерд╛рддреН, @alexbrainman рдФрд░ @mattn) рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рд╕рд╣рдорддрд┐ рдХреА рдХрдореА рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдЬ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХрд╛ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рд╣реИ: рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджрд╛рдпрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд▓рдЧрднрдЧ 10 рд╡рд░реНрд╖реЛрдВ рддрдХ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдЧреЛ рдиреЗ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд╕рдм рдХреБрдЫ рдЕрдХреЗрд▓рд╛ рдЫреЛрдбрд╝ рджреЗрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЧреЛ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд░рд╣реЗрдЧрд╛ред

рдореИрдВрдиреЗ FILE_SHARE_DELETE рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓реЗрдВ рдЦреЛрд▓рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП #34681 рджрд╛рдпрд░ рдХрд┐рдпрд╛ рдерд╛ (рдЕрднреА рднреА рд╕рдВрднрд╛рд╡рд┐рдд) рдШрдЯрдирд╛ рдореЗрдВ рдХрд┐ рдпрд╣ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрд╕ рд╡рд┐рдЪрд╛рд░ рддрдХ рд╕реАрдорд┐рдд рдПрдХ рдирдпрд╛ рд╕реВрддреНрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдЬреЛ рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред

@rsc , рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ, рдЖрдЗрдП рд╕реБрдиреЗрдВ рдХрд┐ рдПрд▓реЗрдХреНрд╕ рдЖрдкрдХреЗ O_ALLOW_DELETE рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддрд╛ рд╣реИред

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╡рд╣ рдПрдХ рдирдП os.OpenFile() рдзреНрд╡рдЬ рдХреЗ рдЦрд┐рд▓рд╛рдл рдереЗ рдЬреЛ file_share_delete рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЙрдиреНрд╣реАрдВ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╡рд╣ рдЖрдкрдХреЗ os.Create/Open/OpenFile() рд╕реБрдЭрд╛рд╡ рд╕реЗ рдЕрд╕рд╣рдордд рдерд╛ред рд╡рд╣ рдЪрд┐рдВрддрд┐рдд рд╣реИ рдХрд┐ рдЕрдиреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдпрд╣ рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рднреА рдХрднреА рднреА рдЗрд╕ рддрд░рд╣ рд╕реЗ рдлрд╛рдЗрд▓реЗрдВ рдирд╣реАрдВ рдЦреЛрд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ MSVC fopen() рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╡реЗ (рдЕрднреА рднреА рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ) рдкреНрд░реЛрдЧреНрд░рд╛рдо рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЧреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рддреЛрдбрд╝ рджреЗрдВрдЧреЗред

рдПрд▓реЗрдХреНрд╕, рдЕрдЧрд░ рдмрд╛рд╣рд░реА рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рддреЛ рдХреЛрдИ рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, ...

рдпрджрд┐ рдЖрдк рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЧреЛ рд░реЗрдкреЛ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЙрддрдирд╛ рд╣реА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрд┐рддрдирд╛ рдЕрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрднреА, рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рдЧреЛ рдХреА рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЙрдкреА рдХрд░рдирд╛ рд╣реИ, рдПрдХ рдкрдВрдХреНрддрд┐ рдмрджрд▓рдирд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЙрд╕ рдХрд╛рдВрдЯреЗ рдХреЛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рд░рдЦрдирд╛ рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рдареАрдХ рд╣реИред https://github.com/moby/moby/pull/39974 рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╕рдордп рдореБрдЭреЗ рднреА рдпрд╣реА рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореИрдВрдиреЗ рдмрд╕ рдпрд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛

https://github.com/alexbrainman/goissue34681

рдмреЗрдЭрд┐рдЭрдХ рдХреЙрдкреА рдХрд░реЗрдВ рдпрд╛ рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рдЗрддрдиреА рд░реБрдЪрд┐ рд╣реИ, рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдЪрд┐рдд рдкреИрдХреЗрдЬ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рджреВрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдЖрдк рдЗрд╕реЗ рдЕрдк рдЯреВ рдбреЗрдЯ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрдЧреНрд╕ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@rsc , рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ, рдЖрдЗрдП рд╕реБрдиреЗрдВ рдХрд┐ рдПрд▓реЗрдХреНрд╕ рдЖрдкрдХреЗ O_ALLOW_DELETE рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддрд╛ рд╣реИред

рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

https://github.com/alexbrainman/goissue34681

рдкреНрд░рдердоред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдо рдЧреЛ рд░реЗрдкреЛ рдореЗрдВ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╢реБрдХреНрд░рд┐рдпрд╛ред

рдПрд▓реЗрдХреНрд╕

рдореИрдВ рдЗрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░рд╛рд╢ рд╣реВрдВред

рдХреЛрдб рдХреЗ рдЗрд╕ рдмрдбрд╝реЗ рд╕рдореВрд╣ рдХреА рдирдХрд▓ рдХрд░рдирд╛, рдЬрд┐рд╕реЗ рдХрд╛рдлреА рд╣рдж рддрдХ рд╕рдордЭрд╛ рднреА рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ (as .)
рдпрд╣ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдпрд╣ рдХрд░ рд░рд╣рд╛ рд╣реИ) рдмрд╕ рд╣рдо рдПрдХ рд╣реА рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рд╕реНрд╡рдпрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдмрд╕ рд╡рд╣ рдЬрд╛рдУ, рдЕрдзрд┐рдХрддрд░ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдореИрдВ рдирд╣реАрдВ рдорд╛рдирддрд╛
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрд╛рдирдмреВрдЭрдХрд░, рд╡рд┐рдХрд▓реНрдк рдХреЛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдиреАрдЪреЗ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдзрди рднреА рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
syscall.Open рдПрдХ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд╕реНрдерд┐рддрд┐ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП syscall.Open рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреНрдпреЛрдВ рд▓рд┐рдЦрдирд╛ рд╣реИ?

рд╢рдирд┐рд╡рд╛рд░, 5 рдЕрдХреНрдЯреВрдмрд░, 2019 рдХреЛ 18:43 рдкрд░ рдПрд▓реЗрдХреНрд╕ рдмреНрд░реЗрдирдореИрди рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдПрд▓реЗрдХреНрд╕, рдЕрдЧрд░ рдмрд╛рд╣рд░реА рдкрд╣реБрдВрдЪ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИ рддреЛ рдХреЛрдИ рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, ...

рдпрджрд┐ рдЖрдк рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
рдЧреЛ рд░реЗрдкреЛ рдХреЛрдб рдореЗрдВред рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЙрддрдирд╛ рд╣реА рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрд┐рддрдирд╛ рдЕрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрднреА, рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЙрдкрд╛рдп рд╣реИ рдХрд┐ рд╕рдЪрдореБрдЪ рдореЗрдВ рд╕реЗ рдХреЛрдб рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рдП
рдЧреЛ рдХреА рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдПрдХ рдкрдВрдХреНрддрд┐ рдмрджрд▓реЗрдВ, рдФрд░ рдлрд┐рд░ рдЙрд╕ рдХрд╛рдВрдЯреЗ рдХреЛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рд░рдЦреЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдЕрд▓рдЧ рдкреИрдХреЗрдЬ рдореЗрдВ рдХреЙрдкреА рдХрд░рдирд╛ рдареАрдХ рд╣реИред рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╕рдордп
moby/moby#39974 https://github.com/moby/moby/pull/39974 рдореБрдЭреЗ рд╡рд╣реА рдорд┐рд▓рд╛
рд╡рд┐рдЪрд╛рд░ред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ, рдореИрдВ
рдмрд╕ рдЗрддрдирд╛ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛

https://github.com/alexbrainman/goissue34681

рдмреЗрдЭрд┐рдЭрдХ рдХреЙрдкреА рдХрд░реЗрдВ рдпрд╛ рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рджрд┐рдпрд╛ рдЧрдпрд╛, рдЗрд╕рдореЗрдВ рдмрд╣реБрдд рд░реБрдЪрд┐ рд╣реИ
рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛, рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдЪрд┐рдд рдкреИрдХреЗрдЬ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдФрд░ рджреВрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдЖрдк рдЗрд╕реЗ рдЕрдк рдЯреВ рдбреЗрдЯ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдмрдЧреНрд╕ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

@rsc https://github.com/rsc , рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ, рдЖрдЗрдП рд╕реБрдирддреЗ рд╣реИрдВ рдХреНрдпрд╛
рдПрд▓реЗрдХреНрд╕ рдЖрдкрдХреЗ O_ALLOW_DELETE рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реИред

рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ

https://github.com/alexbrainman/goissue34681

рдкреНрд░рдердоред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдо рдирдпрд╛ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
рдЧреЛ рд░реЗрдкреЛ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ред

рд╢реБрдХреНрд░рд┐рдпрд╛ред

рдПрд▓реЗрдХреНрд╕

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/32088?email_source=notifications&email_token=AAGDCZXHULQEMHAPTO6ZUJTQNFGE7A5CNFSM4HNPNYIKYY3PNVWWK3TUL52HS4DFVREXGEAN7QM
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAGDCZWYUNMCTAGO567AV73QNFGE7ANCNFSM4HNPNYIA
.

>

  • рдмреНрд░рд╛рдпрди рдЧреЛрдлреН

рдореИрдВ рдЗрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░рд╛рд╢ рд╣реВрдВред

рдореБрдЭреЗ рдЦреЗрдж рд╣реИ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА?

рдПрд▓реЗрдХреНрд╕

@rsc , рдЪреВрдВрдХрд┐ рдПрд▓реЗрдХреНрд╕ рдПрдХ os.OpenFile() рдзреНрд╡рдЬ рдХрд╛ рднреА рд╡рд┐рд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдХреНрдпрд╛ рд╣рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдмрд┐рд▓реНрдб рдлреНрд▓реИрдЧ рдХреЗ рдкреАрдЫреЗ рдХреИрд╕реЗ рд░рдЦрд╛ рдЬрд╛рдП?

рдЬреИрд╕реЗ рдХрд┐ "рдЧреЛ рдиреЗ рд▓рдЧрднрдЧ 10 рд╡рд░реНрд╖реЛрдВ рддрдХ рд╡рд┐рдВрдбреЛрдЬрд╝ рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд┐рдпрд╛," рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдерд╛, рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрдм рдЖрдкрдХреЛ рдПрдХ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред (рдпрд╣ рдкрд┐рдЫрд▓реЗ 7 рд╡рд░реНрд╖реЛрдВ рд╕реЗ рд╡рд┐рдВрдбреЛрдЬ 8/10 рд▓реИрдкрдЯреЙрдк рдкрд░ рднреА рдЯреВрдЯрд╛ рд╣реБрдЖ рдерд╛ред)

рдореЗрд░реЗ рдкрд╛рд╕ os.OpenFile рдФрд░ syscall рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рдВрдЯрд╛ рд╣реИред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА moby/moby рдореЗрдВ рдЦреЛрд▓реЗрдВред

рд╣рдо рдпрд╣рд╛рдБ рдЗрддрдиреЗ рдмрд░реНрдЦрд╛рд╕реНрдд рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ?

рдордВрдЧрд▓рд╡рд╛рд░, 8 рдЕрдХреНрдЯреВрдмрд░, 2019 рдХреЛ 01:47 рдмрдЬреЗ рдПрд▓реЗрдХреНрд╕ рдмреНрд░реЗрдирдореИрди рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдореИрдВ рдЗрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд┐рд░рд╛рд╢ рд╣реВрдВред

рдореБрдЭреЗ рдЦреЗрдж рд╣реИ рдХрд┐ рдЖрдк рдРрд╕рд╛ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА?

рдПрд▓реЗрдХреНрд╕

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/golang/go/issues/32088?email_source=notifications&email_token=AAGDCZRV72GY4IJQJVJWMYTQNRCIHA5CNFSM4HNPNYIKYY3PNVWWK3TUL52HS4DFVREXGEAVMVBW63LNMVXHJJKT
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AAGDCZRNYSMIE6BX77XJVWDQNRCIHANCNFSM4HNPNYIA
.

>

  • рдмреНрд░рд╛рдпрди рдЧреЛрдлреН

рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПред рд╣рдо рдЙрди рд╡рд┐рдВрдбреЛрдЬрд╝ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП TOCTOU рд╕реБрд░рдХреНрд╖рд╛ рдмрдЧреНрд╕ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ os.OpenFile рдХреЗ рдореМрдЬреВрджрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдереЗред

рдпрд╣рд╛рдВ рдмрдбрд╝рд╛ рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐, "рд╣рдо рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ CreateFile рдФрд░ NtCreateFile рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдЧреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рдордиреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рджрд┐рд▓рдЪрд╕реНрдк рдлрд╝реНрд▓реИрдЧ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?" рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрди рд╕рднреА рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдХреЗ рдирд╣реАрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

@ zx2c4 рдХреНрдпрд╛ рдЖрдкрдиреЗ рдкреВрд░рд╛ рд╕реВрддреНрд░ рдкрдврд╝рд╛? рд╣рдо рдЧреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдПрдХ рднреА рдорд╛рдорд▓реЗ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдереЗ, рдЬреЛ рдмрд╛рд░-рдмрд╛рд░ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдореМрдЬреВрджрд╛, рдЧреИрд░-рджрд╕реНрддрд╛рд╡реЗрдЬ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

https://github.com/golang/go/issues/32088#issuecomment -537590826 рдХреЛ рдПрдХ рд╕рдкреНрддрд╛рд╣ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЕрднреА рднреА рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╕рд╣рдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрдВрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ред

рдореИрдВрдиреЗ https://github.com/golang/go/issues/34681#issuecomment -565853605 рдореЗрдВ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

gopherbot picture gopherbot  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

OneOfOne picture OneOfOne  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Miserlou picture Miserlou  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

michaelsafyan picture michaelsafyan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rsc picture rsc  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ