15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains utility functions for dealing with the local 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// filesystem. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_FILE_UTIL_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_FILE_UTIL_H_ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <windows.h> 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <sys/stat.h> 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <unistd.h> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h> 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/base_export.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/platform_file.h" 315e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/file_descriptor_posix.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/posix/eintr_wrapper.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass Time; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)extern bool g_bug108724_debug; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//----------------------------------------------------------------------------- 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Functions that involve filesystem access or modification: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns an absolute version of a relative path. Returns an empty path on 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// error. On POSIX, this function fails if the path does not exist. This 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// function can result in I/O so it can be slow. 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochBASE_EXPORT FilePath MakeAbsoluteFilePath(const FilePath& input); 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the total number of bytes used by all the files under |root_path|. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If the path does not exist the function returns 0. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function is implemented using the FileEnumerator class so it is not 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// particularly speedy in any platform. 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochBASE_EXPORT int64 ComputeDirectorySize(const FilePath& root_path); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Deletes the given path, whether it's a file or a directory. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If it's a directory, it's perfectly happy to delete all of the 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// directory's contents. Passing true to recursive deletes 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subdirectories and their contents as well. 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns true if successful, false otherwise. It is considered successful 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// to attempt to delete a file that does not exist. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In posix environment and if |path| is a symbolic link, this deletes only 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the symlink. (even if the symlink points to a non-existent file) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WARNING: USING THIS WITH recursive==true IS EQUIVALENT 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TO "rm -rf", SO USE WITH CAUTION. 727dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBASE_EXPORT bool DeleteFile(const FilePath& path, bool recursive); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Schedules to delete the given path, whether it's a file or a directory, until 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the operating system is restarted. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) The file/directory to be deleted should exist in a temp folder. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) The directory to be deleted must be empty. 807dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBASE_EXPORT bool DeleteFileAfterReboot(const FilePath& path); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Moves the given path, whether it's a file or a directory. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If a simple rename is not possible, such as in the case where the paths are 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on different volumes, this will attempt to copy and delete. Returns 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// true for success. 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This function fails if either path contains traversal components ('..'). 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochBASE_EXPORT bool Move(const FilePath& from_path, const FilePath& to_path); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Renames file |from_path| to |to_path|. Both paths must be on the same 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// volume, or the function will fail. Destination file will be created 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// if it doesn't exist. Prefer this function over Move when dealing with 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// temporary files. On Windows it preserves attributes of the target file. 94b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Returns true on success, leaving *error unchanged. 95b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)// Returns false on failure and sets *error appropriately, if it is non-NULL. 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochBASE_EXPORT bool ReplaceFile(const FilePath& from_path, 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const FilePath& to_path, 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PlatformFileError* error); 99b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copies a single file. Use CopyDirectory to copy directories. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This function fails if either path contains traversal components ('..'). 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBASE_EXPORT bool CopyFile(const FilePath& from_path, const FilePath& to_path); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copies the given path, and optionally all subdirectories and their contents 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as well. 106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// 107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// If there are files existing under to_path, always overwrite. Returns true 108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// if successful, false otherwise. Wildcards on the names are not supported. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If you only need to copy a file use CopyFile, it's faster. 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBASE_EXPORT bool CopyDirectory(const FilePath& from_path, 1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const FilePath& to_path, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool recursive); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the given path exists on the local filesystem, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// false otherwise. 1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBASE_EXPORT bool PathExists(const FilePath& path); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the given path is writable by the user, false otherwise. 1207dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBASE_EXPORT bool PathIsWritable(const FilePath& path); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the given path exists and is a directory, false otherwise. 1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBASE_EXPORT bool DirectoryExists(const FilePath& path); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the contents of the two files given are equal, false 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// otherwise. If either file can't be read, returns false. 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBASE_EXPORT bool ContentsEqual(const FilePath& filename1, 1287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const FilePath& filename2); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if the contents of the two text files given are equal, false 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// otherwise. This routine treats "\r\n" and "\n" as equivalent. 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBASE_EXPORT bool TextContentsEqual(const FilePath& filename1, 1337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const FilePath& filename2); 1347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace base 1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// ----------------------------------------------------------------------------- 1387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace file_util { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Read the file at |path| into |contents|, returning true on success. 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This function fails if the |path| contains path traversal components ('..'). 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |contents| may be NULL, in which case this function is useful for its 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// side effect of priming the disk cache. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Useful for unit tests. 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool ReadFileToString(const base::FilePath& path, 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string* contents); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Read exactly |bytes| bytes from file descriptor |fd|, storing the result 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in |buffer|. This function is protected against EINTR and partial reads. 152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Returns true iff |bytes| bytes have been successfully read from |fd|. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT bool ReadFromFD(int fd, char* buffer, size_t bytes); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a symbolic link at |symlink| pointing to |target|. Returns 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// false on failure. 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool CreateSymbolicLink(const base::FilePath& target, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& symlink); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reads the given |symlink| and returns where it points to in |target|. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false upon failure. 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool ReadSymbolicLink(const base::FilePath& symlink, 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* target); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bits ans masks of the file permission. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum FilePermissionBits { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PERMISSION_MASK = S_IRWXU | S_IRWXG | S_IRWXO, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PERMISSION_USER_MASK = S_IRWXU, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PERMISSION_GROUP_MASK = S_IRWXG, 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PERMISSION_OTHERS_MASK = S_IRWXO, 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PERMISSION_READ_BY_USER = S_IRUSR, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PERMISSION_WRITE_BY_USER = S_IWUSR, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PERMISSION_EXECUTE_BY_USER = S_IXUSR, 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PERMISSION_READ_BY_GROUP = S_IRGRP, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PERMISSION_WRITE_BY_GROUP = S_IWGRP, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PERMISSION_EXECUTE_BY_GROUP = S_IXGRP, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PERMISSION_READ_BY_OTHERS = S_IROTH, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PERMISSION_WRITE_BY_OTHERS = S_IWOTH, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_PERMISSION_EXECUTE_BY_OTHERS = S_IXOTH, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reads the permission of the given |path|, storing the file permission 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// bits in |mode|. If |path| is symbolic link, |mode| is the permission of 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a file which the symlink points to. 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool GetPosixFilePermissions(const base::FilePath& path, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* mode); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets the permission of the given |path|. If |path| is symbolic link, sets 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the permission of a file which the symlink points to. 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool SetPosixFilePermissions(const base::FilePath& path, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mode); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_POSIX) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return true if the given directory is empty 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool IsDirectoryEmpty(const base::FilePath& dir_path); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the temporary directory provided by the system. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WARNING: DON'T USE THIS. If you want to create a temporary file, use one of 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the functions below. 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool GetTempDir(base::FilePath* path); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get a temporary directory for shared memory files. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Only useful on POSIX; redirects to GetTempDir() on Windows. 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool GetShmemTempDir(base::FilePath* path, bool executable); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the home directory. This is more complicated than just getenv("HOME") 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// as it knows to fall back on getpwent() etc. 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT base::FilePath GetHomeDir(); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a temporary file. The full path is placed in |path|, and the 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// function returns true if was successful in creating the file. The file will 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be empty and all handles closed after this function returns. 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool CreateTemporaryFile(base::FilePath* path); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Same as CreateTemporaryFile but the file is created in |dir|. 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool CreateTemporaryFileInDir(const base::FilePath& dir, 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* temp_file); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create and open a temporary file. File is opened for read/write. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The full path is placed in |path|. 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Returns a handle to the opened file or NULL if an error occurred. 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT FILE* CreateAndOpenTemporaryFile(base::FilePath* path); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Like above but for shmem files. Only useful for POSIX. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The executable flag says the file needs to support using 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// mprotect with PROT_EXEC after mapping. 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT FILE* CreateAndOpenTemporaryShmemFile(base::FilePath* path, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool executable); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Similar to CreateAndOpenTemporaryFile, but the file is created in |dir|. 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT FILE* CreateAndOpenTemporaryFileInDir(const base::FilePath& dir, 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* path); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a new directory. If prefix is provided, the new directory name is in 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the format of prefixyyyy. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: prefix is ignored in the POSIX implementation. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If success, return true and output the full path of the directory created. 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool CreateNewTempDirectory( 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType& prefix, 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* new_temp_path); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create a directory within another directory. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extra characters will be appended to |prefix| to ensure that the 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// new directory does not have the same name as an existing directory. 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool CreateTemporaryDirInDir( 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& base_dir, 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType& prefix, 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* new_dir); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a directory, as well as creating any parent directories, if they 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// don't exist. Returns 'true' on successful creation, or if the directory 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// already exists. The directory is only readable by the current user. 250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Returns true on success, leaving *error unchanged. 251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Returns false on failure and sets *error appropriately, if it is non-NULL. 252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)BASE_EXPORT bool CreateDirectoryAndGetError(const base::FilePath& full_path, 253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::PlatformFileError* error); 254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Backward-compatible convenience method for the above. 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool CreateDirectory(const base::FilePath& full_path); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the file size. Returns true on success. 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool GetFileSize(const base::FilePath& file_path, int64* file_size); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets |real_path| to |path| with symbolic links and junctions expanded. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On windows, make sure the path starts with a lettered drive. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |path| must reference a file. Function will fail if |path| points to 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a directory or to a nonexistent path. On windows, this function will 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fail if |path| is a junction or symlink that points to an empty file, 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or if |real_path| would be longer than MAX_PATH characters. 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool NormalizeFilePath(const base::FilePath& path, 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* real_path); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given a path in NT native form ("\Device\HarddiskVolumeXX\..."), 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// return in |drive_letter_path| the equivalent path that starts with 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a drive letter ("C:\..."). Return false if no such path exists. 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool DevicePathToDriveLetterPath(const base::FilePath& device_path, 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* drive_letter_path); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given an existing file in |path|, set |real_path| to the path 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in native NT format, of the form "\Device\HarddiskVolumeXX\..". 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false if the path can not be found. Empty files cannot 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// be resolved with this function. 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool NormalizeToNativeFilePath(const base::FilePath& path, 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath* nt_path); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function will return if the given file is a symlink or not. 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool IsLink(const base::FilePath& file_path); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns information about the given file path. 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool GetFileInfo(const base::FilePath& file_path, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::PlatformFileInfo* info); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets the time of the last access and the time of the last modification. 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool TouchFile(const base::FilePath& path, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& last_accessed, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& last_modified); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Set the time of the last modification. Useful for unit tests. 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool SetLastModifiedTime(const base::FilePath& path, 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& last_modified); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Store inode number of |path| in |inode|. Return true on success. 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool GetInode(const base::FilePath& path, ino_t* inode); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Wrapper for fopen-like calls. Returns non-NULL FILE* on success. 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT FILE* OpenFile(const base::FilePath& filename, const char* mode); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Closes file opened by OpenFile. Returns true on success. 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT bool CloseFile(FILE* file); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Truncates an open file to end at the location of the current file pointer. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is a cross-platform analog to Windows' SetEndOfFile() function. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT bool TruncateFile(FILE* file); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reads the given number of bytes from the file into the buffer. Returns 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the number of read bytes, or -1 on error. 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT int ReadFile(const base::FilePath& filename, char* data, int size); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Writes the given buffer into the file, overwriting any data that was 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// previously there. Returns the number of bytes written, or -1 on error. 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT int WriteFile(const base::FilePath& filename, const char* data, 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int size); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Append the data to |fd|. Does not close |fd| when done. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BASE_EXPORT int WriteFileDescriptor(const int fd, const char* data, int size); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Append the given buffer into the file. Returns the number of bytes written, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// or -1 on error. 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT int AppendToFile(const base::FilePath& filename, 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* data, int size); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the current working directory for the process. 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool GetCurrentDirectory(base::FilePath* path); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets the current working directory for the process. 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool SetCurrentDirectory(const base::FilePath& path); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Attempts to find a number that can be appended to the |path| to make it 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unique. If |path| does not exist, 0 is returned. If it fails to find such 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a number, -1 is returned. If |suffix| is not empty, also checks the 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// existence of it with the given suffix. 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT int GetUniquePathNumber(const base::FilePath& path, 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::StringType& suffix); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Creates a directory with a guaranteed unique name based on |path|, returning 349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the pathname if successful, or an empty path if there was an error creating 350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the directory. Does not create parent directories. 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)BASE_EXPORT base::FilePath MakeUniqueDirectory(const base::FilePath& path); 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_POSIX) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that |path| can only be changed by a given user and members of 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a given set of groups. 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Specifically, test that all parts of |path| under (and including) |base|: 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Exist. 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Are owned by a specific user. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Are not writable by all users. 361a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// * Are owned by a member of a given set of groups, or are not writable by 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// their group. 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Are not symbolic links. 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is useful for checking that a config file is administrator-controlled. 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |base| must contain |path|. 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool VerifyPathControlledByUser(const base::FilePath& base, 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uid_t owner_uid, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::set<gid_t>& group_gids); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_POSIX) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) && !defined(OS_IOS) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Is |path| writable only by a user with administrator privileges? 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This function uses Mac OS conventions. The super user is assumed to have 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// uid 0, and the administrator group is assumed to be named "admin". 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Testing that |path|, and every parent directory including the root of 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the filesystem, are owned by the superuser, controlled by the group 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "admin", are not writable by all users, and contain no symbolic links. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Will return false if |path| does not exist. 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool VerifyPathControlledByAdmin(const base::FilePath& path); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_MACOSX) && !defined(OS_IOS) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns the maximum length of path component on the volume containing 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the directory |path|, in the number of FilePath::CharType, or -1 on failure. 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT int GetMaximumPathComponentLength(const base::FilePath& path); 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class to handle auto-closing of FILE*'s. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedFILEClose { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void operator()(FILE* x) const { 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (x) { 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fclose(x); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef scoped_ptr_malloc<FILE, ScopedFILEClose> ScopedFILE; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class to handle auto-closing of FDs. 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedFDClose { 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline void operator()(int* x) const { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (x && *x >= 0) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HANDLE_EINTR(close(*x)) < 0) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DPLOG(ERROR) << "close"; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef scoped_ptr_malloc<int, ScopedFDClose> ScopedFD; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // OS_POSIX 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Broad categories of file systems as returned by statfs() on Linux. 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum FileSystemType { 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_SYSTEM_UNKNOWN, // statfs failed. 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_SYSTEM_0, // statfs.f_type == 0 means unknown, may indicate AFS. 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_SYSTEM_ORDINARY, // on-disk filesystem like ext2 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_SYSTEM_NFS, 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_SYSTEM_SMB, 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_SYSTEM_CODA, 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_SYSTEM_MEMORY, // in-memory file system 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_SYSTEM_CGROUP, // cgroup control. 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_SYSTEM_OTHER, // any other value. 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FILE_SYSTEM_TYPE_COUNT 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Attempts determine the FileSystemType for |path|. 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns false if |path| doesn't exist. 4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)BASE_EXPORT bool GetFileSystemType(const base::FilePath& path, 4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileSystemType* type); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace file_util 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Internal -------------------------------------------------------------------- 4387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace base { 4407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochnamespace internal { 4417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Same as Move but allows paths with traversal components. 4437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use only with extreme care. 4447dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBASE_EXPORT bool MoveUnsafe(const FilePath& from_path, 4457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const FilePath& to_path); 4467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Same as CopyFile but allows paths with traversal components. 4487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Use only with extreme care. 4497dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBASE_EXPORT bool CopyFileUnsafe(const FilePath& from_path, 4507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const FilePath& to_path); 4517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(OS_WIN) 4537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Copy from_path to to_path recursively and then delete from_path recursively. 4547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Returns true if all operations succeed. 4557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// This function simulates Move(), but unlike Move() it works across volumes. 456a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// This function is not transactional. 4577dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochBASE_EXPORT bool CopyAndDeleteDirectory(const FilePath& from_path, 4587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const FilePath& to_path); 4597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif // defined(OS_WIN) 4607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace internal 4627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} // namespace base 4637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // BASE_FILE_UTIL_H_ 465