Giter Site home page Giter Site logo

fileprovider's Introduction

FileProvider (experimental)

This Swift library provide a swifty way to deal with local and remote files and directories in a unified way.

Swift Version License Platform CocoaPods Compatible codebeat badge

This library provides implementaion of WebDav and SMB/CIFS (incomplete) and local files.

All functions are async calls and it wont block your main thread.

Features

  • LocalFileProvider a wrapper around NSFileManager with some additions like searching and reading a portion of file.
  • WebDAVFileProvider WebDAV protocol is usual file transmission system on Macs.
  • SMBFileProvider SMB/CIFS and SMB2/3 are file and printer sharing protocol which is originated from IBM & Microsoft and SMB2/3 is now replacing AFP protocol on MacOS. I implemented data types and some basic functions but main interface is not implemented yet!
  • DropboxFileProvider
  • FTPFileProvider
  • AmazonS3FileProvider

Requirements

  • Swift 2.2
  • iOS 8.0 , OSX 10.10
  • XCode 7.3

Installation

Cocoapods / Carthage / Swift Package Manager

FileProvider supports both CocoaPods.

Add this line to your pods file:

pod "FileProvider"

Git

To have latest updates with ease, use this command on terminal to get a clone:

git clone https://github.com/amosavian/FileProvider FileProvider

You can update your library using this command in FileProvider folder:

git pull

if you have a git based project, use this command in your projects directory to add this project as a submodule to your project:

git submodule add https://github.com/amosavian/FileProvider FileProvider

Manually

Copy Source folder to your project and Voila!

Usage

Each provider has a specific class which conforms to FileProvider protocol and share same syntax

Initialization

For LocalFileProvider if you want to deal with Documents folder

let documentsProvider = LocalFileProvider()

is equal to:

let documentPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true);
let documentsURL = NSURL(fileURLWithPath: documentPath);
let documentsProvider = LocalFileProvider(baseURL: documentsURL)

You can't change the base url later. and all paths are related to this base url by default.

For remote file providers authentication may be necessary:

let credential = NSURLCredential(user: "user", password: "pass", persistence: NSURLCredentialPersistence.Permanent)
let webdavProvider = WebDAVFileProvider(baseURL: "http://www.example.com/dav", credential: credential)

For interaction with UI, set delegate variable of FileProvider object

Delegate

For updating User interface please consider using delegate method instead of completion handlers. Delegate methods are guaranteed to run in main thread to avoid bugs.

It's simply tree method which indicated whether the operation failed, succeed and how much of operation has been done (suitable for uploading and downloading operations).

Your class should conforms FileProviderDelegate class:

override func viewDidLoad() {
	documentsProvider.delegate = self
}

func fileproviderSucceed(fileProvider: FileProvider, operation: FileOperation) {
	switch operation {
	case .Copy(source: let source, destination: let dest):
		NSLog("\(source) copied to \(dest).")
	case .Remove(path: let path):
		NSLog("\(path) has been deleted.")
	default:
		break
	}
}

func fileproviderFailed(fileProvider: FileProvider, operation: FileOperation) {
	switch operation {
	case .Copy(source: let source, destination: let dest):
		NSLog("copy of \(source) failed.")
	case .Remove(path: let path):
		NSLog("\(path) can't be deleted.")
	default:
		break
	}
}

func fileproviderProgress(fileProvider: FileProvider, operation: FileOperation, progress: Float) {
	switch operation {
	case .Copy(source: let source, destination: let dest):
		NSLog("Copy\(source) to \(dest): \(progress * 100) completed.")
	default:
		break
	}
}

Note: fileproviderProgress() delegate method is not called by LocalFileProvider.

It's recommended to use completion handlers for error handling or result processing.

Directory contents and file attributes

There is a FileObject class which holds file attributes like size and creation date. You can retrieve information of files inside a directory or get information of a file directly

documentsProvider.attributesOfItemAtPath(path: "/file.txt", completionHandler: {
    (attributes: LocalFileObject?, error: ErrorType?) -> Void} in
	if let attributes = attributes {
		print("File Size: \(attributes.size)")
		print("Creation Date: \(attributes.createdDate)")
		print("Modification Date: \(modifiedDate)")
		print("Is Read Only: \(isReadOnly)")
	}
)

documentsProvider.contentsOfDirectoryAtPath(path: "/", 	completionHandler: {
    (contents: [LocalFileObject], error: ErrorType?) -> Void} in
	for file in contents {
		print("Name: \(attributes.name)")
		print("Size: \(attributes.size)")
		print("Creation Date: \(attributes.createdDate)")
		print("Modification Date: \(modifiedDate)")
	}
)

Change current directory

documentsProvider.currentPath = "/New Folder"
// now path is ~/Documents/New Folder

Creating File and Folders

Creating new directory:

documentsProvider.createFolder(folderName: "new folder", atPath: "/", completionHandler: nil)

Creating new file from data stream:

let data = "hello world!".dataUsingEncoding(NSUTF8StringEncoding)
let file = FileObject(name: "old.txt", createdDate: NSDate(), modifiedDate: NSDate(), isHidden: false, isReadOnly: true)
documentsProvider.createFile(fileAttribs: file, atPath: "/", contents: data, completionHandler: nil)

Copy and Move/Rename Files

// Copy file old.txt to new.txt in current path
documentsProvider.copyItemAtPath(path: "new folder/old.txt", toPath: "new.txt", overwrite: false, completionHandler: nil)

// Move file old.txt to new.txt in current path
documentsProvider.moveItemAtPath(path: "new folder/old.txt", toPath: "new.txt", overwrite: false, completionHandler: nil)

Delete Files

documentsProvider.removeItemAtPath(path: "new.txt", completionHandler: nil)

Caution: This method will not delete directories with content.

Retrieve Content of File

THere is two method for this purpose, one of them loads entire file into NSData and another can load a portion of file.

documentsProvider.contentsAtPath(path: "old.txt:, completionHandler: {
	(contents: NSData?, error: ErrorType?) -> Void
	if let contents = contents {
		print(String(data: contents, encoding: NSUTF8StringEncoding)) // "hello world!"
	}
})

If you want to retrieve a portion of file you should can contentsAtPath method with offset and length arguments. Please note first byte of file has offset: 0.

documentsProvider.contentsAtPath(path: "old.txt", offset: 2, length: 5, completionHandler: {
	(contents: NSData?, error: ErrorType?) -> Void
	if let contents = contents {
		print(String(data: contents, encoding: NSUTF8StringEncoding)) // "llo w"
	}
})

Write Data To Files

let data = "What's up Newyork!".dataUsingEncoding(NSUTF8StringEncoding)
documentsProvider.writeContentsAtPath(path: "old.txt", contents data: data, atomically: true, completionHandler: nil)

Monitoring FIle Changes

Contribute

We would love for you to contribute to FileProvider, check the LICENSE file for more info.

Meta

Amir-Abbas Mousavia โ€“ @amosavian

Distributed under the MIT license. See LICENSE for more information.

https://github.com/yourname/github-link

fileprovider's People

Contributors

amosavian avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.