This paper explores how to choose the most appropriate file system for your embedded design. For example, should your design use a FAT file system or a transaction-based file system? Does it need to run reliably on low-cost NAND flash or recover quickly from file errors? This paper addresses these issues and examines the importance of dynamic wear leveling, static wear leveling, read-degradation monitoring, write buffering, background defragmentation, and other techniques.