Files
scummvm-web/include/FileUtils.php
T
Thunderforge 453e74263b WEB: Adding file size and extension to recommended downloads (#191)
* WEB: Refactor reading files into FileUtils

Refactoring code in `include/Objects/File` into `FileUtils`. This not only makes the code much cleaner, but also allows it to be used in other places of the app, such as the `DownloadsModel`.

* WEB: Adding file size and extension to recommended downloads
2022-01-10 15:39:01 -06:00

119 lines
4.1 KiB
PHP

<?php
namespace ScummVM;
/**
* Utility functions related to files on a file system.
*/
class FileUtils
{
/**
* Returns whether or not the file exists and is readable
*
* @param $path the path to the file that will be analyzed
* @return whether or not the file exists
*/
public static function exists($path)
{
$path = FileUtils::toAbsolutePathIfOnServer($path);
return is_file($path) && is_readable($path);
}
/**
* Returns the file size in a human-readable form (e.g. 75.2M).
*
* @param $path the path to the file that will be analyzed
* @return the file size in a human-readable form
*/
public static function getFileSize($path)
{
$path = FileUtils::toAbsolutePathIfOnServer($path);
// Get the file size, rounded to the nearest kilobyte
$file_size = round((@filesize($path) / 1024));
if ($file_size < 1024) {
$file_size = $file_size . "K";
} else {
$file_size /= 1024;
if ($file_size < 1024) {
$file_size = round($file_size, 1) . "M";
} else {
$file_size /= 1024;
$file_size = round($file_size, 2) . "G";
}
}
return $file_size;
}
/**
* Returns the extension of the given file.
*
* @param $path the path to the file that will be analyzed
* @return the extension
*/
public static function getExtension($path)
{
$path = FileUtils::toAbsolutePathIfOnServer($path);
// Get everything to the right of the last period
$extension = substr($path, (strrpos($path, '.')));
// For certain extensions, check for another extension (e.g. foo.tar.gz => tar.gz)
if ($extension == '.bz2' || $extension == '.gz' || $extension == '.xz' || $extension == '.7z') {
$extension = substr($path, strrpos($path, '.', -(strlen($path) - strrpos($path, '.') + 1)));
}
return $extension;
}
/**
* Returns the SHA-256 hash of the given file.
*
* @param $path the path to the file that will be analyzed
* @return the SHA-256 hash
*/
public static function getSha256($path)
{
$path = FileUtils::toAbsolutePathIfOnServer($path);
// Check if we already have a generated hash file
if ((is_file($path . '.sha256') && is_readable($path . '.sha256'))
&& (@filemtime($path . '.sha256') > @filemtime($path))
) {
// Read the file and return the included hash
return file_get_contents($path . '.sha256');
} else {
// Generate a SHA-256 hash, save it to a file for later, then return the hash
$hash = hash_file('sha256', $path);
file_put_contents($path . '.sha256', $hash);
return $hash;
}
}
/**
* Returns the date and time that the given file was last modified.
*
* @param $path the path to the file that will be analyzed
* @return the date and time
*/
public static function getLastModified($path)
{
$path = FileUtils::toAbsolutePathIfOnServer($path);
return date('F j, Y, g:i a', @filemtime($path));
}
/**
* Returns the path of the file. If the file exists on the ScummVM web server at the expected location, convert to an
* absolute path. Otherwise, return the relative path provided as input.
*
* This method was created due to different behaviors between local developers' machines and the ScummVM server.
* For instance, code for calculating SHA-256 hashes would work locally for files in `public_html/frs`, but not on
* the ScummVM web server where an absolute path was the only way that the code would work. Using this method means
* that code will work in both environments.
*
* @param $path the relative path to the file that will be analyzed
* @return the path of the file, either relative or absolute
*/
private static function toAbsolutePathIfOnServer($relativePath)
{
return is_file(DIR_SERVER_ROOT . '/'. $relativePath) ? DIR_SERVER_ROOT . '/'. $relativePath : $relativePath;
}
}