Add a way to copy a file in archive into filesystem.
This commit is contained in:
parent
e5e1e207b6
commit
c95a93ef1c
6 changed files with 138 additions and 1 deletions
52
atom/common/asar/scoped_temporary_file.cc
Normal file
52
atom/common/asar/scoped_temporary_file.cc
Normal file
|
@ -0,0 +1,52 @@
|
|||
// Copyright (c) 2014 GitHub, Inc. All rights reserved.
|
||||
// Use of this source code is governed by the MIT license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
#include "atom/common/asar/scoped_temporary_file.h"
|
||||
|
||||
#include "base/file_util.h"
|
||||
#include "base/threading/thread_restrictions.h"
|
||||
|
||||
namespace asar {
|
||||
|
||||
ScopedTemporaryFile::ScopedTemporaryFile() {
|
||||
}
|
||||
|
||||
ScopedTemporaryFile::~ScopedTemporaryFile() {
|
||||
if (!path_.empty()) {
|
||||
base::ThreadRestrictions::ScopedAllowIO allow_io;
|
||||
base::DeleteFile(path_, false);
|
||||
}
|
||||
}
|
||||
|
||||
bool ScopedTemporaryFile::Init() {
|
||||
if (!path_.empty())
|
||||
return true;
|
||||
|
||||
base::ThreadRestrictions::ScopedAllowIO allow_io;
|
||||
return base::CreateTemporaryFile(&path_);
|
||||
}
|
||||
|
||||
bool ScopedTemporaryFile::InitFromFile(const base::FilePath& path,
|
||||
uint64 offset, uint64 size) {
|
||||
if (!Init())
|
||||
return false;
|
||||
|
||||
base::File src(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
|
||||
if (!src.IsValid())
|
||||
return false;
|
||||
|
||||
std::vector<char> buf(size);
|
||||
int len = src.Read(offset, buf.data(), buf.size());
|
||||
if (len != static_cast<int>(size))
|
||||
return false;
|
||||
|
||||
base::File dest(path_, base::File::FLAG_OPEN | base::File::FLAG_WRITE);
|
||||
if (!dest.IsValid())
|
||||
return false;
|
||||
|
||||
return dest.WriteAtCurrentPos(buf.data(), buf.size()) ==
|
||||
static_cast<int>(size);
|
||||
}
|
||||
|
||||
} // namespace asar
|
Loading…
Add table
Add a link
Reference in a new issue