-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathFile.html
153 lines (86 loc) · 3.96 KB
/
File.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
---
title: File
layout: default
---
<div class="main">
<div class="banner">
<span>Ruby on Rails 8.0.0</span><br />
<div class="type">Class</div>
<h1>
File
<span class="parent"><
<a href="Object.html">Object</a>
</span>
</h1>
<ul class="files">
<li><a href="../files/activesupport/lib/active_support/core_ext/file/atomic_rb.html">activesupport/lib/active_support/core_ext/file/atomic.rb</a></li>
<li><a href="../files/railties/lib/rails/commands/credentials/credentials_command/diffing_rb.html">railties/lib/rails/commands/credentials/credentials_command/diffing.rb</a></li>
<li><a href="../files/railties/lib/rails/generators/app_base_rb.html">railties/lib/rails/generators/app_base.rb</a></li>
</ul>
</div>
<div id="bodyContent">
<div id="content">
<h2 id="methods">Methods</h2>
<ul>
<li>
<a href="#method-c-atomic_write">atomic_write</a>
</li>
</ul>
<!-- Methods -->
<h2 id="class-public-methods">Class Public methods</h2>
<div class="method">
<h3 id="method-c-atomic_write">
atomic_write(file_name, temp_dir = dirname(file_name))
</h3>
<div class="description">
<p>Write to a file atomically. Useful for situations where you don’t want other processes or threads to see half-written files.</p>
<pre><code>File.atomic_write('important.file') do |file|
file.write('hello')
end
</code></pre>
<p>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 behavior you can provide a different directory but it must be on the same physical filesystem as the file you’re trying to write.</p>
<pre><code>File.atomic_write('/data/something.important', '/data/tmp') do |file|
file.write('hello')
end
</code></pre>
</div>
<details class="method__source">
<summary>
<span class="label">📝 Source code</span>
</summary>
<pre><code class="ruby"># File activesupport/lib/active_support/core_ext/file/atomic.rb, line 21
def self.atomic_write(file_name, temp_dir = dirname(file_name))
require "tempfile" unless defined?(Tempfile)
Tempfile.open(".#{basename(file_name)}", temp_dir) do |temp_file|
temp_file.binmode
return_val = yield temp_file
temp_file.close
old_stat = if exist?(file_name)
# Get original file permissions
stat(file_name)
else
# If not possible, probe which are the default permissions in the
# destination directory.
probe_stat_in(dirname(file_name))
end
if old_stat
# Set correct permissions on new file
begin
chown(old_stat.uid, old_stat.gid, temp_file.path)
# This operation will affect filesystem ACL's
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</code></pre>
<a href="https://github.com/rails/rails/blob/dd8f7185faeca6ee968a6e9367f6d8601a83b8db/activesupport/lib/active_support/core_ext/file/atomic.rb#L21" target="_blank" class="github_url">🔎 See on GitHub</a>
</details>
</div>
</div>
</div>
</div>