149 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
| // Copyright (c) 2014-2015, b3log.org
 | |
| //
 | |
| // Licensed under the Apache License, Version 2.0 (the "License");
 | |
| // you may not use this file except in compliance with the License.
 | |
| // You may obtain a copy of the License at
 | |
| //
 | |
| //     http://www.apache.org/licenses/LICENSE-2.0
 | |
| //
 | |
| // Unless required by applicable law or agreed to in writing, software
 | |
| // distributed under the License is distributed on an "AS IS" BASIS,
 | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| // See the License for the specific language governing permissions and
 | |
| // limitations under the License.
 | |
| 
 | |
| package util
 | |
| 
 | |
| import (
 | |
| 	"io"
 | |
| 	"os"
 | |
| 	"path/filepath"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/b3log/wide/log"
 | |
| )
 | |
| 
 | |
| // Logger.
 | |
| var fileLogger = log.NewLogger(os.Stdout)
 | |
| 
 | |
| type myfile struct{}
 | |
| 
 | |
| // File utilities.
 | |
| var File = myfile{}
 | |
| 
 | |
| // GetFileSize get the length in bytes of file of the specified path.
 | |
| func (*myfile) GetFileSize(path string) int64 {
 | |
| 	fi, err := os.Stat(path)
 | |
| 	if nil != err {
 | |
| 		return -1
 | |
| 	}
 | |
| 
 | |
| 	return fi.Size()
 | |
| }
 | |
| 
 | |
| // IsExist determines whether the file spcified by the given path is exists.
 | |
| func (*myfile) IsExist(path string) bool {
 | |
| 	_, err := os.Stat(path)
 | |
| 
 | |
| 	return err == nil || os.IsExist(err)
 | |
| }
 | |
| 
 | |
| // IsBinary determines whether the specified content is a binary file content.
 | |
| func (*myfile) IsBinary(content string) bool {
 | |
| 	for _, b := range content {
 | |
| 		if 0 == b {
 | |
| 			return true
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return false
 | |
| }
 | |
| 
 | |
| // IsImg determines whether the specified extension is a image.
 | |
| func (*myfile) IsImg(extension string) bool {
 | |
| 	ext := strings.ToLower(extension)
 | |
| 
 | |
| 	switch ext {
 | |
| 	case ".jpg", ".jpeg", ".bmp", ".gif", ".png", ".svg", ".ico":
 | |
| 		return true
 | |
| 	default:
 | |
| 		return false
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // IsDir determines whether the specified path is a directory.
 | |
| func (*myfile) IsDir(path string) bool {
 | |
| 	fio, err := os.Lstat(path)
 | |
| 	if nil != err {
 | |
| 		fileLogger.Warnf("Determines whether [%s] is a directory failed: [%v]", path, err)
 | |
| 
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	return fio.IsDir()
 | |
| }
 | |
| 
 | |
| // CopyFile copies the source file to the dest file.
 | |
| func (*myfile) CopyFile(source string, dest string) (err error) {
 | |
| 	sourcefile, err := os.Open(source)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	defer sourcefile.Close()
 | |
| 
 | |
| 	destfile, err := os.Create(dest)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	defer destfile.Close()
 | |
| 
 | |
| 	_, err = io.Copy(destfile, sourcefile)
 | |
| 	if err == nil {
 | |
| 		sourceinfo, err := os.Stat(source)
 | |
| 		if err != nil {
 | |
| 			err = os.Chmod(dest, sourceinfo.Mode())
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // CopyDir copies the source directory to the dest directory.
 | |
| func (*myfile) CopyDir(source string, dest string) (err error) {
 | |
| 	sourceinfo, err := os.Stat(source)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	// create dest dir
 | |
| 	err = os.MkdirAll(dest, sourceinfo.Mode())
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	directory, _ := os.Open(source)
 | |
| 	objects, err := directory.Readdir(-1)
 | |
| 
 | |
| 	for _, obj := range objects {
 | |
| 		srcFilePath := filepath.Join(source, obj.Name())
 | |
| 		destFilePath := filepath.Join(dest, obj.Name())
 | |
| 
 | |
| 		if obj.IsDir() {
 | |
| 			// create sub-directories - recursively
 | |
| 			err = File.CopyDir(srcFilePath, destFilePath)
 | |
| 			if err != nil {
 | |
| 				fileLogger.Error(err)
 | |
| 			}
 | |
| 		} else {
 | |
| 			err = File.CopyFile(srcFilePath, destFilePath)
 | |
| 			if err != nil {
 | |
| 				fileLogger.Error(err)
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 |