backup_deduplicator/data/
fileid.rs

1
2// device id
3
4use std::io;
5use std::path::Path;
6use file_id::FileId;
7use serde::Serialize;
8
9/// Device id type.
10#[cfg(target_family = "unix")]
11type DeviceIdType = u64;
12
13/// Device id type.
14#[cfg(target_family = "windows")]
15type DeviceIdType = u64; // high-res file-id
16
17/// File id type
18#[cfg(target_family = "unix")]
19type FileIdType = u64;
20
21/// File id type
22#[cfg(target_family = "windows")]
23type FileIdType = u128; // high-res file-id
24
25/// A file id handle.
26/// 
27/// # Fields
28/// * `inode` - The inode of the file.
29/// * `drive` - The device id of the file.
30#[derive(Debug, Clone, PartialEq, Serialize)]
31pub struct HandleIdentifier {
32    pub inode: FileIdType,
33    pub drive: DeviceIdType,
34}
35
36impl HandleIdentifier {
37    /// Create a new handle identifier from a path.
38    /// 
39    /// # Arguments
40    /// * `path` - The path to the file.
41    /// 
42    /// # Returns
43    /// The handle identifier.
44    /// 
45    /// # Errors
46    /// If the file id cannot be retrieved.
47    pub fn from_path(path: impl AsRef<Path>) -> io::Result<HandleIdentifier> {
48        match file_id::get_file_id(path)? {
49            FileId::Inode { device_id, inode_number } => Ok(HandleIdentifier {
50                // unix
51                inode: inode_number as FileIdType,
52                drive: device_id as DeviceIdType,
53            }),
54            FileId::LowRes { volume_serial_number, file_index } => Ok(HandleIdentifier {
55                // windows
56                inode: file_index as FileIdType,
57                drive: volume_serial_number as DeviceIdType,
58            }),
59            FileId::HighRes { volume_serial_number, file_id } => Ok(HandleIdentifier {
60                // windows
61                inode: file_id as FileIdType,
62                drive: volume_serial_number as DeviceIdType,
63            }),
64        }
65    }
66}
67
68