you can refer attach file with this test code. poem = '\ Programming is fun When the work is done if you wanna make your work also fun: use Python! '
f = file('poem.txt', 'w') # open for 'w'riting f.write(poem) # write text to file f.close() # close the file f = file('poem.txt') # if no mode is specified, 'r'ead mode is assumed by default while True: line = f.readline() if len(line) == 0: # Zero length indicates EOF break print line, # Notice comma to avoid automatic newline added by Python f.close() # close the file but the datastore limit filesize 1M.it is trashiness. this code is included my opensource blog ,http://code.google.com/p/woiclub On 12/19/08, Ross Ridge <rri...@csclub.uwaterloo.ca> wrote: > > jeremy wrote: > > i was hoping to seamlessly virtualize a filesystem on top of > > datastore. it seems there is no pure-python approach to filesystem > > virtualization, making this impossible. should i give up on this or > > have a i overlooked something? > > I don't see why you would think it's impossible. It's certainly > possible to write a filesystem implementation in pure Python, I've > done it. > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Google App Engine" group. To post to this group, send email to google-appengine@googlegroups.com To unsubscribe from this group, send email to google-appengine+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en -~----------~----~----~----~------~----~------~--~---
""" This is experimental code to provide writable filesystem capability to App Engine. It can be enabled through importing, just with ``import filesystem``. """ from google.appengine.ext import db from google.appengine.ext import gql import os import sys import tempfile from datetime import datetime import time from google.appengine.ext import db import logging import itertools from StringIO import StringIO ''' poem = '\ Programming is fun When the work is done if you wanna make your work also fun: use Python! ' f = file('poem.txt', 'w') # open for 'w'riting f.write(poem) # write text to file f.close() # close the file f = file('poem.txt') # if no mode is specified, 'r'ead mode is assumed by default while True: line = f.readline() if len(line) == 0: # Zero length indicates EOF break print line, # Notice comma to avoid automatic newline added by Python f.close() # close the file ''' class Files(db.Model): basename = db.StringProperty() dir = db.StringProperty() path = db.StringProperty() content = db.BlobProperty() mtime_dt = db.DateTimeProperty(auto_now=True) ctime_dt = db.DateTimeProperty(auto_now_add=True) filetype = db.StringProperty() @property def is_dir(self): return not self.basename @classmethod def get_file(cls, filename, create=False ,filetype =None): query = cls.gql('WHERE path = :1', filename) files = query.fetch(1) if files: return files[0] if not create: return None if filename.startswith("/"): if not filetype: split = path.rfind('.') ext = path[split + 1:] file = cls( key_name = filename, basename=os.path.basename(filename), dir=os.path.dirname(filename), path=filename, content='', mtime_dt=datetime.now(), ctime_dt=datetime.now(), filetype=ext, ) return file @classmethod def listdir(cls, dir): results =[] files = cls.gql('WHERE dir = :1', dir) results = [file.basename for file in files] return results @classmethod def mkdir(cls, dir): pass @classmethod def readlink(cls, path): # path = os.path.abspath(path) obj = cls.get_file(path) if obj is None: return obj return obj.content @classmethod def remove(cls, path): # path = os.path.abspath(path) obj = cls.get_file(path) if not obj: db.delete(obj) @classmethod def rename(cls, src, dest): obj = cls.get_file(src) if obj is None: return False dest_obj = cls.get_file(dest) if dest_obj is not None: if dest_obj.is_dir: return False else: cls.remove(dest) return True obj.path = dest if obj.is_dir: obj.dir = dest obj.basename = '' else: obj.dir = os.path.dirname(dest) obj.basename = os.path.basename(dest) obj.put() @classmethod def rmdir(cls, path): pass @classmethod def stat(cls, path): obj = cls.get_file(path) if obj is None: return obj return os.stat_result(( 0, # mode 0, # inode 0, # device 1, # hard links 0, # owner uid 0, # gid len(obj.content or ''), # size 0, # atime obj.mtime, # mtime obj.ctime, # ctime )) @classmethod def dump(cls): """Returns all the files in a text description """ objs = list(cls.all()) objs.sort(key=lambda obj: obj.path) lines = [] for obj in objs: if obj.is_dir: lines.append('Dir: %s' % obj.path) else: lines.append('File: %s (%i bytes)' % (obj.path, len(obj.content or ''))) return '\n'.join(lines) def open(oldfilename, mode='r', buffering=0): ## FIXME: totally ignore buffering? create = mode.startswith('w') or mode.startswith('rw') or mode.startswith('a') fileobj = Files.get_file(oldfilename, create=create) if fileobj is None: return None if fileobj.is_dir: return None return FileWrapper(fileobj, mode=mode) class FileWrapper(object): def __init__(self, fileobj, pos=0, mode='r'): self.fileobj = fileobj self.pos = pos mode = mode.replace('U', '').replace('t', '').replace('b', '') assert mode in ('r', 'w', 'rw', 'a'), ( "Bad mode: %r" % mode) self.mode = mode if mode == 'a': self.pos = len(self.fileobj.content) self._closed = False def read(self, size=-1): if size == -1: t = self.fileobj.content[self.pos:] self.pos = len(self.fileobj.content) return t else: t = self.fileobj.content[self.pos:self.pos+size] self.pos = min(len(self.fileobj.content), self.pos+size) return t def readline(self, size=-1): parts = self.fileobj.content[self.pos:].split('\n', 1) if len(parts) == 2: next = parts[0] + '\n' else: next = parts[0] if size == -1 or size <= len(next): self.pos += len(next) return next else: self.pos += size return next[:size] def readlines(self, size=-1): if size == -1: rest = self.fileobj.content[self.pos:] self.pos = len(self.fileobj.content) else: rest = self.fileobj.content[self.pos:self.pos+size] self.pos += size return rest.splitlines(True) def write(self, text): self.fileobj.content = self.fileobj.content[:self.pos] + text + self.fileobj.content[self.pos+len(text):] self.pos += len(text) self.fileobj.mtime_dt = datetime.now() def writelines(self, lines): self.write(''.join(lines)) def seek(self, pos): self.assert_state(None) self.pos = pos def tell(self): self.assert_state(None) return self.pos def close(self): self.fileobj.put() self._closed = True def flush(self): self.assert_state(None) self.fileobj.put()