If I mount directory A(have a file file_a in it) to directory B, the two directories are in different filesystems, will file_a in the two directories share the same inode number?
Yes,the inode number of the file will be that of the source directory A. Any new file created in directory B will follow the conventions of the file system in which directory A is present.In Linux terminology,what you're doing is essentially a bind mount.
Related
I am on a vxworks 6.9 platform. I want to know how many files are in a folder. The file system is DOSFS (FAT). The only way I know how to do this is to simply loop through every file in the folder and count. This gets very expensive the more files in the folder. Is there a more sensible way to do this? Does there exist some internal database or count of all files in a folder?
The FAT filesystem does not keep track of the number of files it contains. What it does contain is:
A boot sector
A filesystem information sector (on FAT32) including:
Last number of known free clusters
Number of the most recently allocated cluster
Two copies of the file allocation table
An area for the root directory (on FAT12 and FAT16)
Data clusters
You'll need to walk the directory tree to get a count.
I am working with the disk file directly. since the size of a directory is 0 in the directory structure, I wonder how do I detect the end of a directory file on the disk.
DIR_Name[0] == 0x00
The above way to detect end of directory doesn't seem reliable. I found on wiki that the size of the root directory in FAT32 is fixed to 512 entries, but what about other subdirectories. I might need to traverse down directories using the FAT and the cluster number.
From the first Google search result for "fat32 on disk format", page 24:
When a directory is created, a file with the ATTR_DIRECTORY bit set in
its DIR_Attr field, you set its DIR_FileSize to 0. DIR_FileSize is not
used and is always 0 on a file with the ATTR_DIRECTORY attribute
(directories are sized by simply following their cluster chains to the
EOC mark).
Also: The FAT32 root directory size is not fixed at 512 entries; its size is determined in exactly the same way as any other directory.
From another reliable source:
Reading Directories
The first step in reading directories is finding and reading the root
directory. On a FAT 12 or FAT 16 volumes the root directory is at a
fixed position immediately after the File Allocation Tables:
first_root_dir_sector = first_data_sector - root_dir_sectors;
In FAT32, root directory appears in data area on given cluster and can be
a cluster chain.
root_cluster_32 = extBS_32->root_cluster;
Emphasis added.
A non-root directory is just a file.
The root directory starts in a fixed place on the disk (following the FAT). An entry in the root directory contains a cluster number. That cluster contains the data of the file or directory. The entry of that cluster number in the FAT, i.e. FAT[cluster_number] contains the number of the next cluster that belongs to the file or directory. That cluster contains more data of the file or directory and the FAT entry contains the number of the next cluster of the file or directory, etcetera, until you encounter the end-of-cluste mark, a value equal to or greater than 0xFFFFFFF8.
I need to create a directory for a file. The easiest path would be to create a directory with the same name as the file, and put the file there.
Is there any case where a valid file name would be an invalid directory name?
The directory will of course be created on the same system as where the file name is valid.
So basically I'm asking if there is any system where there are different limitations on directory names and file names.
As the number of characters in a path is limited on some filesystems, any file that uses more than half the limit of path characters would cause problems if put into a directory of the same name.
I'm looking to list and store the contents of a directory in a struct using C on Windows.
I got a problem with stat(), I don't really understand this line
if (statut.st_mode & S_IFDIR)
So I want to understand how it works for checking if it's a directory or a file?
stat() retrieves a block of information describing the specified file. Directories are also files. A directory can be thought of as a file that contains other files.
So, in the file's st_mode, you can see whether the current file is actually a directory by checking for the presence of the S_IFDIR bit.
If in fat16 system i am much confused about distinguishing a sub-directory and a file. As sub directory and a file have similar structure, how do we distinguish a directory and a file and how do we traverse through directories to reach the file?
I initially thought all the directory entries will start with '0x2e' as 1st byte of 8.3 naming convention in fat16. But practically i couldn't find all the directories starting with 0x2e but directly the name of the directory.
So, how can i distinguish directory and a file in fat16?
Directories have the 0x10 bit set in the attribute field; files do not. The first byte is "." (0x2E) for self and parent directories, if present (which they aren't in the root).
The content of the directory "file" is an array of directory entries.
Ignoring long file names, the way you search for a file is:
SearchDirectory = root
Parse off 8.3 name from remaining path
DirectoryEntry = Look up 8.3 name in SearchDirectory
If remaining path is empty, then DirectoryEntry is the requested entity
If Directory.Attribute & 0x10 == 0 then ERROR (expecting a directory)
SearchDirectory = DirectoryEntry.contents
Goto 2