forked from M-Labs/rust-fatfs
Make chrono crate dependency optional.
This commit is contained in:
parent
a7ca474a2f
commit
b604b19bde
@ -3,7 +3,10 @@ name = "rfat"
|
||||
version = "0.1.0"
|
||||
authors = ["Rafał Harabień <rafalh1992@o2.pl>"]
|
||||
|
||||
[features]
|
||||
default = ["chrono"]
|
||||
|
||||
[dependencies]
|
||||
byteorder = "1"
|
||||
bitflags = "1.0"
|
||||
chrono = "0.4"
|
||||
chrono = { version = "0.4", optional = true }
|
||||
|
@ -1,9 +1,11 @@
|
||||
extern crate rfat;
|
||||
extern crate chrono;
|
||||
|
||||
use std::env;
|
||||
use std::fs::File;
|
||||
use std::io::BufReader;
|
||||
use std::str;
|
||||
use chrono::{DateTime, Local};
|
||||
|
||||
use rfat::FatFileSystem;
|
||||
|
||||
@ -34,7 +36,7 @@ fn main() {
|
||||
};
|
||||
for r in dir.iter() {
|
||||
let e = r.unwrap();
|
||||
let modified = e.modified().format("%Y-%m-%d %H:%M:%S").to_string();
|
||||
let modified = DateTime::<Local>::from(e.modified()).format("%Y-%m-%d %H:%M:%S").to_string();
|
||||
println!("{:4} {} {}", format_file_size(e.len()), modified, e.file_name());
|
||||
}
|
||||
}
|
||||
|
79
src/dir.rs
79
src/dir.rs
@ -4,6 +4,8 @@ use std::io::prelude::*;
|
||||
use std::io;
|
||||
use std::io::{Cursor, ErrorKind, SeekFrom};
|
||||
use byteorder::{LittleEndian, ReadBytesExt};
|
||||
|
||||
#[cfg(feature = "chrono")]
|
||||
use chrono::{DateTime, Date, TimeZone, Local};
|
||||
|
||||
use fs::{FatFileSystemRef, FatSlice};
|
||||
@ -90,6 +92,61 @@ pub struct FatDirEntry<'a, 'b: 'a> {
|
||||
fs: FatFileSystemRef<'a, 'b>,
|
||||
}
|
||||
|
||||
pub struct DosDate {
|
||||
pub year: u16,
|
||||
pub month: u16,
|
||||
pub day: u16,
|
||||
}
|
||||
|
||||
pub struct DosTime {
|
||||
pub hour: u16,
|
||||
pub min: u16,
|
||||
pub sec: u16,
|
||||
}
|
||||
|
||||
pub struct DosDateTime {
|
||||
pub date: DosDate,
|
||||
pub time: DosTime,
|
||||
}
|
||||
|
||||
impl DosDate {
|
||||
pub(crate) fn from_word(dos_date: u16) -> Self {
|
||||
let (year, month, day) = ((dos_date >> 9) + 1980, (dos_date >> 5) & 0xF, dos_date & 0x1F);
|
||||
DosDate { year, month, day }
|
||||
}
|
||||
}
|
||||
|
||||
impl DosTime {
|
||||
pub(crate) fn from_word(dos_time: u16) -> Self {
|
||||
let (hour, min, sec) = (dos_time >> 11, (dos_time >> 5) & 0x3F, (dos_time & 0x1F) * 2);
|
||||
DosTime { hour, min, sec }
|
||||
}
|
||||
}
|
||||
|
||||
impl DosDateTime {
|
||||
pub(crate) fn from_words(dos_date: u16, dos_time: u16) -> Self {
|
||||
DosDateTime {
|
||||
date: DosDate::from_word(dos_date),
|
||||
time: DosTime::from_word(dos_time),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "chrono")]
|
||||
impl From<DosDate> for Date<Local> {
|
||||
fn from(date: DosDate) -> Self {
|
||||
Local.ymd(date.year as i32, date.month as u32, date.day as u32)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "chrono")]
|
||||
impl From<DosDateTime> for DateTime<Local> {
|
||||
fn from(date_time: DosDateTime) -> Self {
|
||||
Date::<Local>::from(date_time.date)
|
||||
.and_hms(date_time.time.hour as u32, date_time.time.min as u32, date_time.time.sec as u32)
|
||||
}
|
||||
}
|
||||
|
||||
impl <'a, 'b> FatDirEntry<'a, 'b> {
|
||||
pub fn short_file_name(&self) -> String {
|
||||
let name_str = String::from_utf8_lossy(&self.data.name[0..8]);
|
||||
@ -146,26 +203,16 @@ impl <'a, 'b> FatDirEntry<'a, 'b> {
|
||||
self.data.size as u64
|
||||
}
|
||||
|
||||
pub fn created(&self) -> DateTime<Local> {
|
||||
Self::convert_date_time(self.data.create_date, self.data.create_time_1)
|
||||
pub fn created(&self) -> DosDateTime {
|
||||
DosDateTime::from_words(self.data.create_date, self.data.create_time_1)
|
||||
}
|
||||
|
||||
pub fn accessed(&self) -> Date<Local> {
|
||||
Self::convert_date(self.data.access_date)
|
||||
pub fn accessed(&self) -> DosDate {
|
||||
DosDate::from_word(self.data.access_date)
|
||||
}
|
||||
|
||||
pub fn modified(&self) -> DateTime<Local> {
|
||||
Self::convert_date_time(self.data.modify_date, self.data.modify_time)
|
||||
}
|
||||
|
||||
fn convert_date(dos_date: u16) -> Date<Local> {
|
||||
let (year, month, day) = ((dos_date >> 9) + 1980, (dos_date >> 5) & 0xF, dos_date & 0x1F);
|
||||
Local.ymd(year as i32, month as u32, day as u32)
|
||||
}
|
||||
|
||||
fn convert_date_time(dos_date: u16, dos_time: u16) -> DateTime<Local> {
|
||||
let (hour, min, sec) = (dos_time >> 11, (dos_time >> 5) & 0x3F, (dos_time & 0x1F) * 2);
|
||||
FatDirEntry::convert_date(dos_date).and_hms(hour as u32, min as u32, sec as u32)
|
||||
pub fn modified(&self) -> DosDateTime {
|
||||
DosDateTime::from_words(self.data.modify_date, self.data.modify_time)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2,12 +2,14 @@
|
||||
#![crate_name = "rfat"]
|
||||
|
||||
extern crate byteorder;
|
||||
extern crate chrono;
|
||||
extern crate core;
|
||||
|
||||
#[macro_use]
|
||||
extern crate bitflags;
|
||||
|
||||
#[cfg(feature = "chrono")]
|
||||
extern crate chrono;
|
||||
|
||||
mod fs;
|
||||
mod dir;
|
||||
mod file;
|
||||
|
Loading…
Reference in New Issue
Block a user