Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
eb731101
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
eb731101
编写于
8月 21, 2015
作者:
M
Matthew Draper
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #16245 from byroot/more-atomic-write
File renaming should be the last operation of an atomic write
上级
07d6e1dc
5d3b3cba
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
29 addition
and
27 deletion
+29
-27
activesupport/lib/active_support/core_ext/file/atomic.rb
activesupport/lib/active_support/core_ext/file/atomic.rb
+29
-27
未找到文件。
activesupport/lib/active_support/core_ext/file/atomic.rb
浏览文件 @
eb731101
...
...
@@ -8,46 +8,48 @@ class File
# file.write('hello')
# end
#
# If your temp directory is not on the same filesystem as the file you're
# trying to write, you can provide a different temporary directory.
# This method needs to create a temporary file. By default it will create it
# in the same directory as the destination file. If you don't like this
# behaviour you can provide a different directory but it must be on the
# same physical filesystem as the the file you're trying to write.
#
# File.atomic_write('/data/something.important', '/data/tmp') do |file|
# file.write('hello')
# end
def
self
.
atomic_write
(
file_name
,
temp_dir
=
Dir
.
tmpdir
)
def
self
.
atomic_write
(
file_name
,
temp_dir
=
dirname
(
file_name
)
)
require
'tempfile'
unless
defined?
(
Tempfile
)
require
'fileutils'
unless
defined?
(
FileUtils
)
temp_file
=
Tempfile
.
new
(
basename
(
file_name
),
temp_dir
)
Tempfile
.
open
(
".
#{
basename
(
file_name
)
}
"
,
temp_dir
)
do
|
temp_file
|
temp_file
.
binmode
return_val
=
yield
temp_file
temp_file
.
close
if
File
.
exist?
(
file_name
)
old_stat
=
if
exist?
(
file_name
)
# Get original file permissions
old_stat
=
stat
(
file_name
)
else
stat
(
file_name
)
elsif
temp_dir
!=
dirname
(
file_name
)
# If not possible, probe which are the default permissions in the
# destination directory.
old_stat
=
probe_stat_in
(
dirname
(
file_name
))
probe_stat_in
(
dirname
(
file_name
))
end
# Overwrite original file with temp file
FileUtils
.
mv
(
temp_file
.
path
,
file_name
)
if
old_stat
# Set correct permissions on new file
begin
chown
(
old_stat
.
uid
,
old_stat
.
gid
,
file_name
)
chown
(
old_stat
.
uid
,
old_stat
.
gid
,
temp_file
.
path
)
# This operation will affect filesystem ACL's
chmod
(
old_stat
.
mode
,
file_name
)
# Make sure we return the result of the yielded block
return_val
chmod
(
old_stat
.
mode
,
temp_file
.
path
)
rescue
Errno
::
EPERM
,
Errno
::
EACCES
# Changing file ownership failed, moving on.
end
end
# Overwrite original file with temp file
rename
(
temp_file
.
path
,
file_name
)
return_val
end
end
# Private utility method.
def
self
.
probe_stat_in
(
dir
)
#:nodoc:
basename
=
[
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录