Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/files/file.h" | 5 #include "base/files/file.h" |
| 6 | 6 |
| 7 #include <io.h> | 7 #include <io.h> |
| 8 | 8 |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 132 return -1; | 132 return -1; |
| 133 | 133 |
| 134 LARGE_INTEGER offset_li; | 134 LARGE_INTEGER offset_li; |
| 135 offset_li.QuadPart = offset; | 135 offset_li.QuadPart = offset; |
| 136 | 136 |
| 137 OVERLAPPED overlapped = {0}; | 137 OVERLAPPED overlapped = {0}; |
| 138 overlapped.Offset = offset_li.LowPart; | 138 overlapped.Offset = offset_li.LowPart; |
| 139 overlapped.OffsetHigh = offset_li.HighPart; | 139 overlapped.OffsetHigh = offset_li.HighPart; |
| 140 | 140 |
| 141 DWORD bytes_read; | 141 DWORD bytes_read; |
| 142 if (::ReadFile(file_, data, size, &bytes_read, &overlapped) != 0) | 142 if (::ReadFile(file_, data, size, &bytes_read, &overlapped)) |
|
cpu_(ooo_6.6-7.5)
2014/03/06 20:43:41
I am confused about the style unification here, be
rvargas (doing something else)
2014/03/06 21:55:34
I generally don't want to compare against anything
| |
| 143 return bytes_read; | 143 return bytes_read; |
| 144 if (ERROR_HANDLE_EOF == GetLastError()) | 144 if (ERROR_HANDLE_EOF == GetLastError()) |
| 145 return 0; | 145 return 0; |
| 146 | 146 |
| 147 return -1; | 147 return -1; |
| 148 } | 148 } |
|
cpu_(ooo_6.6-7.5)
2014/03/06 20:43:41
Just a suggestion:
it would look pretty if there
rvargas (doing something else)
2014/03/06 21:55:34
That method would look a little suspicious to me a
| |
| 149 | 149 |
| 150 int File::ReadAtCurrentPos(char* data, int size) { | 150 int File::ReadAtCurrentPos(char* data, int size) { |
| 151 base::ThreadRestrictions::AssertIOAllowed(); | 151 base::ThreadRestrictions::AssertIOAllowed(); |
| 152 DCHECK(IsValid()); | 152 DCHECK(IsValid()); |
| 153 DCHECK(!async_); | 153 DCHECK(!async_); |
| 154 if (size < 0) | 154 if (size < 0) |
| 155 return -1; | 155 return -1; |
| 156 | 156 |
| 157 DWORD bytes_read; | 157 DWORD bytes_read; |
| 158 if (::ReadFile(file_, data, size, &bytes_read, NULL) != 0) | 158 if (::ReadFile(file_, data, size, &bytes_read, NULL)) |
| 159 return bytes_read; | 159 return bytes_read; |
| 160 if (ERROR_HANDLE_EOF == GetLastError()) | 160 if (ERROR_HANDLE_EOF == GetLastError()) |
| 161 return 0; | 161 return 0; |
| 162 | 162 |
| 163 return -1; | 163 return -1; |
| 164 } | 164 } |
| 165 | 165 |
| 166 int File::ReadNoBestEffort(int64 offset, char* data, int size) { | 166 int File::ReadNoBestEffort(int64 offset, char* data, int size) { |
| 167 return Read(offset, data, size); | 167 return Read(offset, data, size); |
| 168 } | 168 } |
| 169 | 169 |
| 170 int File::ReadAtCurrentPosNoBestEffort(char* data, int size) { | 170 int File::ReadAtCurrentPosNoBestEffort(char* data, int size) { |
| 171 return ReadAtCurrentPos(data, size); | 171 return ReadAtCurrentPos(data, size); |
| 172 } | 172 } |
| 173 | 173 |
| 174 int File::Write(int64 offset, const char* data, int size) { | 174 int File::Write(int64 offset, const char* data, int size) { |
| 175 base::ThreadRestrictions::AssertIOAllowed(); | 175 base::ThreadRestrictions::AssertIOAllowed(); |
| 176 DCHECK(IsValid()); | 176 DCHECK(IsValid()); |
| 177 DCHECK(!async_); | 177 DCHECK(!async_); |
| 178 | 178 |
| 179 LARGE_INTEGER offset_li; | 179 LARGE_INTEGER offset_li; |
| 180 offset_li.QuadPart = offset; | 180 offset_li.QuadPart = offset; |
| 181 | 181 |
| 182 OVERLAPPED overlapped = {0}; | 182 OVERLAPPED overlapped = {0}; |
| 183 overlapped.Offset = offset_li.LowPart; | 183 overlapped.Offset = offset_li.LowPart; |
| 184 overlapped.OffsetHigh = offset_li.HighPart; | 184 overlapped.OffsetHigh = offset_li.HighPart; |
| 185 | 185 |
| 186 DWORD bytes_written; | 186 DWORD bytes_written; |
| 187 if (::WriteFile(file_, data, size, &bytes_written, &overlapped) != 0) | 187 if (::WriteFile(file_, data, size, &bytes_written, &overlapped)) |
| 188 return bytes_written; | 188 return bytes_written; |
| 189 | 189 |
| 190 return -1; | 190 return -1; |
| 191 } | 191 } |
| 192 | 192 |
| 193 int File::WriteAtCurrentPos(const char* data, int size) { | 193 int File::WriteAtCurrentPos(const char* data, int size) { |
|
Nico
2014/03/06 23:57:59
fwiw, i'd have named "write" "writeatoffset" and "
| |
| 194 NOTREACHED(); | 194 base::ThreadRestrictions::AssertIOAllowed(); |
| 195 DCHECK(IsValid()); | |
| 196 DCHECK(!async_); | |
| 197 if (size < 0) | |
| 198 return -1; | |
| 199 | |
| 200 DWORD bytes_written; | |
| 201 if (::WriteFile(file_, data, size, &bytes_written, NULL)) | |
| 202 return bytes_written; | |
| 203 | |
| 195 return -1; | 204 return -1; |
| 196 } | 205 } |
| 197 | 206 |
| 198 int File::WriteAtCurrentPosNoBestEffort(const char* data, int size) { | 207 int File::WriteAtCurrentPosNoBestEffort(const char* data, int size) { |
| 199 return WriteAtCurrentPos(data, size); | 208 return WriteAtCurrentPos(data, size); |
| 200 } | 209 } |
| 201 | 210 |
| 202 int64 File::GetLength() { | 211 int64 File::GetLength() { |
| 203 base::ThreadRestrictions::AssertIOAllowed(); | 212 base::ThreadRestrictions::AssertIOAllowed(); |
| 204 DCHECK(IsValid()); | 213 DCHECK(IsValid()); |
| 205 LARGE_INTEGER size; | 214 LARGE_INTEGER size; |
| 206 if (!::GetFileSizeEx(file_.Get(), &size)) | 215 if (!::GetFileSizeEx(file_.Get(), &size)) |
| 207 return -1; | 216 return -1; |
| 208 | 217 |
| 209 return static_cast<int64>(size.QuadPart); | 218 return static_cast<int64>(size.QuadPart); |
| 210 } | 219 } |
| 211 | 220 |
| 212 bool File::SetLength(int64 length) { | 221 bool File::SetLength(int64 length) { |
| 213 base::ThreadRestrictions::AssertIOAllowed(); | 222 base::ThreadRestrictions::AssertIOAllowed(); |
| 214 DCHECK(IsValid()); | 223 DCHECK(IsValid()); |
| 215 | 224 |
| 216 // Get the current file pointer. | 225 // Get the current file pointer. |
| 217 LARGE_INTEGER file_pointer; | 226 LARGE_INTEGER file_pointer; |
| 218 LARGE_INTEGER zero; | 227 LARGE_INTEGER zero; |
| 219 zero.QuadPart = 0; | 228 zero.QuadPart = 0; |
| 220 if (::SetFilePointerEx(file_, zero, &file_pointer, FILE_CURRENT) == 0) | 229 if (!::SetFilePointerEx(file_, zero, &file_pointer, FILE_CURRENT)) |
| 221 return false; | 230 return false; |
| 222 | 231 |
| 223 LARGE_INTEGER length_li; | 232 LARGE_INTEGER length_li; |
| 224 length_li.QuadPart = length; | 233 length_li.QuadPart = length; |
| 225 // If length > file size, SetFilePointerEx() should extend the file | 234 // If length > file size, SetFilePointerEx() should extend the file |
| 226 // with zeroes on all Windows standard file systems (NTFS, FATxx). | 235 // with zeroes on all Windows standard file systems (NTFS, FATxx). |
| 227 if (!::SetFilePointerEx(file_, length_li, NULL, FILE_BEGIN)) | 236 if (!::SetFilePointerEx(file_, length_li, NULL, FILE_BEGIN)) |
| 228 return false; | 237 return false; |
| 229 | 238 |
| 230 // Set the new file length and move the file pointer to its old position. | 239 // Set the new file length and move the file pointer to its old position. |
| 231 // This is consistent with ftruncate()'s behavior, even when the file | 240 // This is consistent with ftruncate()'s behavior, even when the file |
| 232 // pointer points to a location beyond the end of the file. | 241 // pointer points to a location beyond the end of the file. |
| 233 // TODO(rvargas): Emulating ftruncate details seem suspicious and it is not | 242 // TODO(rvargas): Emulating ftruncate details seem suspicious and it is not |
| 234 // promised by the interface (nor was promised by PlatformFile). See if this | 243 // promised by the interface (nor was promised by PlatformFile). See if this |
| 235 // implementation detail can be removed. | 244 // implementation detail can be removed. |
| 236 return ((::SetEndOfFile(file_) != 0) && | 245 return ((::SetEndOfFile(file_) != FALSE) && |
| 237 (::SetFilePointerEx(file_, file_pointer, NULL, FILE_BEGIN) != 0)); | 246 (::SetFilePointerEx(file_, file_pointer, NULL, FILE_BEGIN) != FALSE)); |
| 238 } | 247 } |
| 239 | 248 |
| 240 bool File::Flush() { | 249 bool File::Flush() { |
| 241 base::ThreadRestrictions::AssertIOAllowed(); | 250 base::ThreadRestrictions::AssertIOAllowed(); |
| 242 DCHECK(IsValid()); | 251 DCHECK(IsValid()); |
| 243 return ::FlushFileBuffers(file_) != FALSE; | 252 return ::FlushFileBuffers(file_) != FALSE; |
| 244 } | 253 } |
| 245 | 254 |
| 246 bool File::SetTimes(Time last_access_time, Time last_modified_time) { | 255 bool File::SetTimes(Time last_access_time, Time last_modified_time) { |
| 247 base::ThreadRestrictions::AssertIOAllowed(); | 256 base::ThreadRestrictions::AssertIOAllowed(); |
| 248 DCHECK(IsValid()); | 257 DCHECK(IsValid()); |
| 249 | 258 |
| 250 FILETIME last_access_filetime = last_access_time.ToFileTime(); | 259 FILETIME last_access_filetime = last_access_time.ToFileTime(); |
| 251 FILETIME last_modified_filetime = last_modified_time.ToFileTime(); | 260 FILETIME last_modified_filetime = last_modified_time.ToFileTime(); |
| 252 return (::SetFileTime(file_, NULL, &last_access_filetime, | 261 return (::SetFileTime(file_, NULL, &last_access_filetime, |
| 253 &last_modified_filetime) != 0); | 262 &last_modified_filetime) != FALSE); |
| 254 } | 263 } |
| 255 | 264 |
| 256 bool File::GetInfo(Info* info) { | 265 bool File::GetInfo(Info* info) { |
| 257 base::ThreadRestrictions::AssertIOAllowed(); | 266 base::ThreadRestrictions::AssertIOAllowed(); |
| 258 DCHECK(IsValid()); | 267 DCHECK(IsValid()); |
| 259 | 268 |
| 260 BY_HANDLE_FILE_INFORMATION file_info; | 269 BY_HANDLE_FILE_INFORMATION file_info; |
| 261 if (GetFileInformationByHandle(file_, &file_info) == 0) | 270 if (!GetFileInformationByHandle(file_, &file_info)) |
| 262 return false; | 271 return false; |
| 263 | 272 |
| 264 LARGE_INTEGER size; | 273 LARGE_INTEGER size; |
| 265 size.HighPart = file_info.nFileSizeHigh; | 274 size.HighPart = file_info.nFileSizeHigh; |
| 266 size.LowPart = file_info.nFileSizeLow; | 275 size.LowPart = file_info.nFileSizeLow; |
| 267 info->size = size.QuadPart; | 276 info->size = size.QuadPart; |
| 268 info->is_directory = | 277 info->is_directory = |
| 269 (file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; | 278 (file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; |
| 270 info->is_symbolic_link = false; // Windows doesn't have symbolic links. | 279 info->is_symbolic_link = false; // Windows doesn't have symbolic links. |
| 271 info->last_modified = base::Time::FromFileTime(file_info.ftLastWriteTime); | 280 info->last_modified = base::Time::FromFileTime(file_info.ftLastWriteTime); |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 325 last_error); | 334 last_error); |
| 326 return FILE_ERROR_FAILED; | 335 return FILE_ERROR_FAILED; |
| 327 } | 336 } |
| 328 } | 337 } |
| 329 | 338 |
| 330 void File::SetPlatformFile(PlatformFile file) { | 339 void File::SetPlatformFile(PlatformFile file) { |
| 331 file_.Set(file); | 340 file_.Set(file); |
| 332 } | 341 } |
| 333 | 342 |
| 334 } // namespace base | 343 } // namespace base |
| OLD | NEW |