<commit_before>﻿/*----------------------------------------------------------
This Source Code Form is subject to the terms of the 
Mozilla Public License, v.2.0. If a copy of the MPL 
was not distributed with this file, You can obtain one 
at http://mozilla.org/MPL/2.0/.
----------------------------------------------------------*/
using ScriptEngine.Machine;
using ScriptEngine.Machine.Contexts;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Security;
using System.Text;

namespace ScriptEngine.HostedScript.Library
{
    [GlobalContext(Category="Файловые операции")]
    public class FileOperations : GlobalContextBase<FileOperations>
    {

        /// <summary>
        /// Копирует файл из одного расположения в другое. Перезаписывает приемник, если он существует.
        /// </summary>
        /// <param name="source">Имя файла-источника</param>
        /// <param name="destination">Имя файла приемника</param>
        [ContextMethod("КопироватьФайл", "CopyFile")]
        public void CopyFile(string source, string destination)
        {
            var scheme = new Uri(source).Scheme;

            if(scheme == Uri.UriSchemeHttp || scheme == Uri.UriSchemeHttps)
                DownloadFromRemote<HttpWebRequest>(source, 
                    destination, WebRequestMethods.Http.Get);
            else if(scheme == Uri.UriSchemeFtp)
                DownloadFromRemote<FtpWebRequest>(source, 
                    destination, WebRequestMethods.Ftp.DownloadFile);
            else
                File.Copy(source, destination, true);

        }

        /// <summary>
        /// Перемещает файл из одного расположения в другое.
        /// </summary>
        /// <param name="source">Имя файла-источника</param>
        /// <param name="destination">Имя файла приемника</param>
        [ContextMethod("ПереместитьФайл", "MoveFile")]
        public void MoveFile(string source, string destination)
        {
            var scheme = new Uri(source).Scheme;

            if (scheme == Uri.UriSchemeHttp || scheme == Uri.UriSchemeHttps)
            {
                DownloadFromRemote<HttpWebRequest>(source,
                    destination, WebRequestMethods.Http.Get);
                DeleteFromRemote<HttpWebRequest>(source, WebRequestMethods.Http.Get);
            }
            else if (scheme == Uri.UriSchemeFtp)
            {
                DownloadFromRemote<FtpWebRequest>(source,
                    destination, WebRequestMethods.Ftp.DownloadFile);
                DeleteFromRemote<FtpWebRequest>(source, WebRequestMethods.Ftp.DeleteFile);
            }
            else
                File.Move(source, destination);
        }

        private void DownloadFromRemote<T>(string source,
            string destination, string method) where T: WebRequest
        {
            var req = (T)WebRequest.Create(source);
            req.Method = method;

            using (var respStream = req.GetResponse().GetResponseStream())
                using (var fs = File.Create(destination))
                    respStream.CopyTo(fs);
        }

        private void DeleteFromRemote<T>(string source, string method) where T : WebRequest
        {
            var req = (T)WebRequest.Create(source);
            req.Method = method;

            using (var resp = req.GetResponse()) { };
        }

        /// <summary>
        /// Возвращает каталог временных файлов ОС
        /// </summary>
        /// <returns>Строка. Путь к каталогу временных файлов</returns>
        [ContextMethod("КаталогВременныхФайлов", "TempFilesDir")]
        public string TempFilesDir()
        {
            return Path.GetTempPath();
        }
<commit_msg>Поправил получения Uri пути<commit_after>﻿/*----------------------------------------------------------
This Source Code Form is subject to the terms of the 
Mozilla Public License, v.2.0. If a copy of the MPL 
was not distributed with this file, You can obtain one 
at http://mozilla.org/MPL/2.0/.
----------------------------------------------------------*/
using ScriptEngine.Machine;
using ScriptEngine.Machine.Contexts;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Security;
using System.Text;

namespace ScriptEngine.HostedScript.Library
{
    [GlobalContext(Category="Файловые операции")]
    public class FileOperations : GlobalContextBase<FileOperations>
    {

        /// <summary>
        /// Копирует файл из одного расположения в другое. Перезаписывает приемник, если он существует.
        /// </summary>
        /// <param name="source">Имя файла-источника</param>
        /// <param name="destination">Имя файла приемника</param>
        [ContextMethod("КопироватьФайл", "CopyFile")]
        public void CopyFile(string source, string destination)
        {
            var scheme = PathScheme(source);

            if(scheme == Uri.UriSchemeHttp || scheme == Uri.UriSchemeHttps)
                DownloadFromRemote<HttpWebRequest>(source, 
                    destination, WebRequestMethods.Http.Get);
            else if(scheme == Uri.UriSchemeFtp)
                DownloadFromRemote<FtpWebRequest>(source, 
                    destination, WebRequestMethods.Ftp.DownloadFile);
            else
                File.Copy(source, destination, true);

        }

        /// <summary>
        /// Перемещает файл из одного расположения в другое.
        /// </summary>
        /// <param name="source">Имя файла-источника</param>
        /// <param name="destination">Имя файла приемника</param>
        [ContextMethod("ПереместитьФайл", "MoveFile")]
        public void MoveFile(string source, string destination)
        {
            var scheme = PathScheme(source);

            if (scheme == Uri.UriSchemeHttp || scheme == Uri.UriSchemeHttps)
            {
                DownloadFromRemote<HttpWebRequest>(source,
                    destination, WebRequestMethods.Http.Get);
                DeleteFromRemote<HttpWebRequest>(source, WebRequestMethods.Http.Get);
            }
            else if (scheme == Uri.UriSchemeFtp)
            {
                DownloadFromRemote<FtpWebRequest>(source,
                    destination, WebRequestMethods.Ftp.DownloadFile);
                DeleteFromRemote<FtpWebRequest>(source, WebRequestMethods.Ftp.DeleteFile);
            }
            else
                File.Move(source, destination);
        }

        public string PathScheme(string path)
        {
            if(Uri.TryCreate(path, UriKind.RelativeOrAbsolute, out Uri uri))
            {
                return uri.Scheme;
            }
            return Uri.UriSchemeFile;
        }

        private void DownloadFromRemote<T>(string source,
            string destination, string method) where T: WebRequest
        {
            var req = (T)WebRequest.Create(source);
            req.Method = method;

            using (var respStream = req.GetResponse().GetResponseStream())
                using (var fs = File.Create(destination))
                    respStream.CopyTo(fs);
        }

        private void DeleteFromRemote<T>(string source, string method) where T : WebRequest
        {
            var req = (T)WebRequest.Create(source);
            req.Method = method;

            using (var resp = req.GetResponse()) { };
        }

        /// <summary>
        /// Возвращает каталог временных файлов ОС
        /// </summary>
        /// <returns>Строка. Путь к каталогу временных файлов</returns>
        [ContextMethod("КаталогВременныхФайлов", "TempFilesDir")]
        public string TempFilesDir()
        {
            return Path.GetTempPath();
        }

{'fraction_non_alphanumeric': 0.1290741462147773, 'fraction_numerical': 0.0010388261264770808, 'mean_word_length': 1.9020346646571213, 'pattern_counts': {'":': 0, '<': 53, '<?xml version=': 0, '>': 53, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 14, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6812475', 'n_tokens_mistral': 2084, 'n_tokens_neox': 2074, 'n_words': 460}