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
|
// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_PLATFORM_FILE_H_
#define BASE_PLATFORM_FILE_H_
#pragma once
#include "base/basictypes.h"
#include "build/build_config.h"
#include "base/time.h"
#if defined(OS_WIN)
#include <windows.h>
#endif
#include <string>
class FilePath;
namespace base {
#if defined(OS_WIN)
typedef HANDLE PlatformFile;
const PlatformFile kInvalidPlatformFileValue = INVALID_HANDLE_VALUE;
#elif defined(OS_POSIX)
typedef int PlatformFile;
const PlatformFile kInvalidPlatformFileValue = -1;
#endif
enum PlatformFileFlags {
PLATFORM_FILE_OPEN = 1,
PLATFORM_FILE_CREATE = 2,
PLATFORM_FILE_OPEN_ALWAYS = 4, // May create a new file.
PLATFORM_FILE_CREATE_ALWAYS = 8, // May overwrite an old file.
PLATFORM_FILE_READ = 16,
PLATFORM_FILE_WRITE = 32,
PLATFORM_FILE_EXCLUSIVE_READ = 64, // EXCLUSIVE is opposite of Windows SHARE
PLATFORM_FILE_EXCLUSIVE_WRITE = 128,
PLATFORM_FILE_ASYNC = 256,
PLATFORM_FILE_TEMPORARY = 512, // Used on Windows only
PLATFORM_FILE_HIDDEN = 1024, // Used on Windows only
PLATFORM_FILE_DELETE_ON_CLOSE = 2048,
PLATFORM_FILE_TRUNCATE = 4096
};
enum PlatformFileError {
PLATFORM_FILE_OK = 0,
PLATFORM_FILE_ERROR_FAILED = -1,
PLATFORM_FILE_ERROR_IN_USE = -2,
PLATFORM_FILE_ERROR_EXISTS = -3,
PLATFORM_FILE_ERROR_NOT_FOUND = -4,
PLATFORM_FILE_ERROR_ACCESS_DENIED = -5,
PLATFORM_FILE_ERROR_TOO_MANY_OPENED = -6,
PLATFORM_FILE_ERROR_NO_MEMORY = -7,
PLATFORM_FILE_ERROR_NO_SPACE = -8,
PLATFORM_FILE_ERROR_NOT_A_DIRECTORY = -9,
PLATFORM_FILE_ERROR_INVALID_OPERATION = -10
};
// Used to hold information about a given file.
// If you add more fields to this structure (platform-specific fields are OK),
// make sure to update all functions that use it in file_util_{win|posix}.cc
// too, and the ParamTraits<base::PlatformFileInfo> implementation in
// chrome/common/common_param_traits.cc.
struct PlatformFileInfo {
// The size of the file in bytes. Undefined when is_directory is true.
int64 size;
// True if the file corresponds to a directory.
bool is_directory;
// The last modified time of a file.
base::Time last_modified;
// The last accessed time of a file.
base::Time last_accessed;
// The creation time of a file.
base::Time creation_time;
};
// Creates or opens the given file. If PLATFORM_FILE_OPEN_ALWAYS is used, and
// |created| is provided, |created| will be set to true if the file was created
// or to false in case the file was just opened. |error_code| can be NULL.
PlatformFile CreatePlatformFile(const FilePath& name,
int flags,
bool* created,
PlatformFileError* error_code);
// Deprecated.
PlatformFile CreatePlatformFile(const std::wstring& name,
int flags,
bool* created);
// Closes a file handle
bool ClosePlatformFile(PlatformFile file);
// Use this class to pass ownership of a PlatformFile to a receiver that may or
// may not want to accept it. This class does not own the storage for the
// PlatformFile.
//
// EXAMPLE:
//
// void MaybeProcessFile(PassPlatformFile pass_file) {
// if (...) {
// PlatformFile file = pass_file.ReleaseValue();
// // Now, we are responsible for closing |file|.
// }
// }
//
// void OpenAndMaybeProcessFile(const FilePath& path) {
// PlatformFile file = CreatePlatformFile(path, ...);
// MaybeProcessFile(PassPlatformFile(&file));
// if (file != kInvalidPlatformFileValue)
// ClosePlatformFile(file);
// }
//
class PassPlatformFile {
public:
explicit PassPlatformFile(PlatformFile* value) : value_(value) {
}
// Called to retrieve the PlatformFile stored in this object. The caller
// gains ownership of the PlatformFile and is now responsible for closing it.
// Any subsequent calls to this method will return an invalid PlatformFile.
PlatformFile ReleaseValue() {
PlatformFile temp = *value_;
*value_ = kInvalidPlatformFileValue;
return temp;
}
private:
PlatformFile* value_;
};
} // namespace base
#endif // BASE_PLATFORM_FILE_H_
|