   # Returns a promise that resolves to a String.
   read: (flushCache) ->
     if @cachedContents? and not flushCache
-      promise = Q(@cachedContents)
+      promise = Promise.resolve(@cachedContents)
     else
-      deferred = Q.defer()
-      promise = deferred.promise
-      content = []
-      bytesRead = 0
-      encoding = @getEncoding()
-      if encoding is 'utf8'
-        readStream = fs.createReadStream(@getPath(), {encoding})
-      else
-        iconv ?= require 'iconv-lite'
-        readStream = fs.createReadStream(@getPath()).pipe(iconv.decodeStream(encoding))
-
-      readStream.on 'data', (chunk) ->
-        content.push(chunk)
-        bytesRead += chunk.length
-        deferred.notify(bytesRead)
-
-      readStream.on 'end', ->
-        deferred.resolve(content.join(''))
-
-      readStream.on 'error', (error) ->
-        if error.code == 'ENOENT'
-          deferred.resolve(null)
+      promise = new Promise (resolve, reject) =>
+        content = []
+        encoding = @getEncoding()
+        if encoding is 'utf8'
+          readStream = fs.createReadStream(@getPath(), {encoding})
         else
-          deferred.reject(error)
+          iconv ?= require 'iconv-lite'
+          readStream = fs.createReadStream(@getPath()).pipe(iconv.decodeStream(encoding))
+
+        readStream.on 'data', (chunk) ->
+          content.push(chunk)
+
+        readStream.on 'end', ->
+          resolve(content.join(''))
+
+        readStream.on 'error', (error) ->
+          if error.code == 'ENOENT'
+            resolve(null)
+          else
+            reject(error)
 
     promise.then (contents) =>
       @setDigest(contents)

  # Public: Returns a promise that resolves to the file's completely resolved {String} path.
  getRealPath: ->
    if @realPath?
      Q(@realPath)
    else
      Q.nfcall(fs.realpath, @path).then (realPath) =>
        @realPath = realPath

  # Public: Return the {String} filename without any directory information.
  getBaseName: ->

  #
  # Returns a promise that resolves to a {String}.
  getDigest: ->
    if @digest?
      Promise.resolve(@digest)
    else
      @read().then => @digest # read assigns digest as a side-effect

  # Public: Get the SHA-1 digest of this file
  #
