}
func (fs *fileStorage) OpenTorrent(info *metainfo.Info, infoHash metainfo.Hash) (TorrentImpl, error) {
+ err := CreateNativeZeroLengthFiles(info, fs.baseDir)
+ if err != nil {
+ return nil, err
+ }
return &fileTorrentStorage{
fs,
info,
return nil
}
+// Creates natives files for any zero-length file entries in the info. This is
+// a helper for file-based storages, which don't address or write to zero-
+// length files because they have no corresponding pieces.
+func CreateNativeZeroLengthFiles(info *metainfo.Info, baseDir string) (err error) {
+ for _, fi := range info.UpvertedFiles() {
+ if fi.Length != 0 {
+ continue
+ }
+ name := filepath.Join(append([]string{baseDir, info.Name}, fi.Path...)...)
+ os.MkdirAll(filepath.Dir(name), 0750)
+ var f io.Closer
+ f, err = os.Create(name)
+ if err != nil {
+ break
+ }
+ f.Close()
+ }
+ return
+}
+
// Exposes file-based storage of a torrent, as one big ReadWriterAt.
type fileStorageTorrent struct {
fts *fileTorrentStorage