qfile 2.1.0

Crate for accessing a file by path, case insensitive. Automatic detection, create a path with a new file or open an existing file
Documentation

[![Crate](https://img.shields.io/crates/v/qfile?color=green)](https://crates.io/crates/qfile)
[![Docs](https://img.shields.io/docsrs/qfile)](https://docs.rs/qfile/latest/qfile/)
[![Changelog](https://img.shields.io/badge/changelog-qfile-blue)](https://github.com/m62624/qfile/blob/main/CHANGELOG.md)

 # Qfile

 Crate for accessing a file by path, case insensitive. Automatic detection, create a path with a new file or open an existing file.

 # Examples
```rust
    // add_path() - constructor for adding a file path. 
    // the real file path: `./FOLDER/folder/File.txt`
    let mut file = QFilePath::add_path("./folder/folder/file.txt").unwrap();
    // after using auto_write() or read() methods, and if Ok(),
    // we get/save the correct path after the first method call,
    // which will be used as a cache when used again.
    file.auto_write("text_1").unwrap();
    // we get the saved path from the cache
    file.auto_write("text_2").unwrap();
    assert_eq!(file.read().unwrap(), "text_1text_2");
  
```

---
```rust
use std::error::Error;
use qfile::*;
fn create_files(count: i32) -> Result<(), Box<dyn Error>> {
    for i in 0..=count {
        QFilePath::add_path(format!("FolderPack/file-{}.txt", i))?.auto_write("")?;
    }
    Ok(())
}
fn main() {
    create_files(100).unwrap();
}
```

---
```rust
    use qfile::*;
    use std::io::BufReader;
    use std::io::Read;
    // The file already exists
    // The real file path: "./My_First_Folder/New_File.txt"
    // File content: Hello World
    let file = QFilePath::add_path("my_first_Folder/new_file.txt")
        .unwrap()
        .get_file(Permissions::RW)
        .unwrap();
    let mut buffer = Vec::new();
    // Read file into vector.
    BufReader::new(file).read_to_end(&mut buffer).unwrap();
    // Show result
    assert_eq!(
        buffer,
        vec![72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100]
    )
```

---

# Paths syntax


### Linux 

  
  > `folder/folder/file.txt`\
  > `./folder/folder/file.txt`

```rust
    let path1 = "File.txt";
    let path2 = "./File.txt";
    let path3 = "../../File.txt";
    let path4 = String::from("Folder/Folder/File.txt");
```

### Windows 

  
  > `folder\\folder\\file.txt`\
  > `.\\folder\\folder\\file.txt`\
  > `D:\\folder\\folder\\file.txt`

```rust
    let path1 = "File.txt";
    let path2 = ".\\File.txt";
    let path3 = "..\\..\\File.txt";
    let path4 = "D:\\Folder\\file.txt";
    let path5 = r"D:\Folder\file.txt";
    let path6 = String::from("D:\\Folder\\file.txt");
```

# Auto Mode


Creates or opens if a file exists (case insensitive)

### Example

```rust
    let mut file = QFilePath::add_path("./file.txt").unwrap();
    file.auto_write("ok").unwrap();
    //=========
    //*code*
    //=========
    file.auto_write("ok").unwrap();
    assert_eq(file.read().unwrap(),"okok");
    
```

---

 ### Linux & Windows

 - If the path exists, we work with the file (case insensitive)

 |                            | Linux                        | Windows                      |
 | -------------------------- | ---------------------------- | ---------------------------- |
 | **The path we specified**: | `folder1/FolDER2/file.TXT`   | `folder1\FolDER2\file.TXT`   |
 | **Real path** :            | `./Folder1/Folder2/file.txt` | `.\Folder1\Folder2\file.txt` |
 | **Result** :               | `./Folder1/Folder2/file.txt` | `.\Folder1\Folder2\file.txt` |

 - If the file/path is not found, creates a new path with the file (*if initial path exists*)

 |                            | Linux                          | Windows                        |
 | -------------------------- | ------------------------------ | ------------------------------ |
 | **The path we specified**: | `./folder/folder_new/file.txt` | `.\folder\folder_new\file.txt` |
 | **Real path** :            | `./folder`                     | `.\folder`                     |
 | **Result** :               | `./folder/folder_new/file.txt` | `.\folder\folder_new\file.txt` |
 
 - But if the initial path is different case of letters and a new file/folder is specified in the path, then a new path is created with the file

 ### Linux :

 |                            |                                                         |
 | -------------------------- | ------------------------------------------------------- |
 | **The path we specified**: | `./FOLDER/Folder_new/file.txt`                          |
 | **Real path** :            | `./folder`                                              |
 | **Result** :               | `./FOLDER/Folder_new/file.txt` - (**new created path**) |
 |                            | `./folder` - (**original path**)                        |

 ### Windows :

 |                            |                                                  |
 | -------------------------- | ------------------------------------------------ |
 | **The path we specified**: | `.\FOLDER\Folder_new\file.txt`                   |
 | **Real path** :            | `.\folder`                                       |
 | **Result** :               | `.\folder\Folder_new\file.txt` - (**real path**) |

 ### Different behavior 

 > * The Windows file system treats file and directory names as **case insensitive**. `file.txt` and `FILE.txt` will be treated as equivalent files (Although the path is case insensitive in windows (`..\FOLDER\file.txt`), you can return a case-sensitive path with : `get_path_str()` or `get_path_buf()`).
 > * The Linux file system treats file and directory names as **case-sensitive**. `file.txt` and `FILE.txt` will be treated as different files.

 ---

 # Changelog
 [List]https://github.com/m62624/qfile/blob/main/CHANGELOG.md
 # License
 [MIT]https://choosealicense.com/licenses/mit/