C#批量压缩并上载CSV数据文件到Box企业云盘
C# .NET 8实现Windows下批量压缩csv文件为zip文件,然后异步上传到box企业云服务网盘路径,实现异常处理和写入运行状态日志,参数来自ini配置文件。
C# .NET 8代码示例,包含INI配置读取、CSV文件压缩、Box上传、异步处理和日志记录功能:
using System.Collections.Concurrent;
using System.IO.Compression;
using IniParser;
using IniParser.Model;
using Box.V2;
using Box.V2.Auth;
using Box.V2.Config;
using Box.V2.Models;class Program
{private static readonly object _logLock = new object();private static string _logPath;static async Task Main(string[] args){try{// 读取配置文件var config = LoadConfiguration("config.ini");// 初始化Box客户端var boxClient = InitializeBoxClient(config);// 处理文件await ProcessFilesAsync(config, boxClient);}catch (Exception ex){Log($"全局异常: {ex.Message}");}}static Configuration LoadConfiguration(string configPath){var parser = new FileIniDataParser();IniData iniData = parser.ReadFile(configPath);return new Configuration{ClientId = iniData["BoxConfig"]["ClientId"],ClientSecret = iniData["BoxConfig"]["ClientSecret"],AccessToken = iniData["BoxConfig"]["AccessToken"],UploadFolderId = iniData["BoxConfig"]["UploadFolderId"],SourceFolder = iniData["FileConfig"]["SourceFolder"],ZipFolder = iniData["FileConfig"]["ZipFolder"],LogPath = iniData["FileConfig"]["LogPath"]};}static BoxClient InitializeBoxClient(Configuration config){_logPath = config.LogPath;var auth = new OAuthSession(config.AccessToken, "N/A", 3600, "bearer");var boxConfig = new BoxConfigBuilder(config.ClientId, config.ClientSecret, new Uri("http://localhost")).Build();return new BoxClient(boxConfig, auth);}static async Task ProcessFilesAsync(Configuration config, BoxClient boxClient){try{Directory.CreateDirectory(config.ZipFolder);Directory.CreateDirectory(Path.GetDirectoryName(_logPath));var csvFiles = Directory.GetFiles(config.SourceFolder, "*.csv");Log($"找到 {csvFiles.Length} 个CSV文件需要处理");var tasks = new ConcurrentBag<Task>();Parallel.ForEach(csvFiles, csvFile =>{tasks.Add(ProcessSingleFileAsync(csvFile, config, boxClient));});await Task.WhenAll(tasks);Log("所有文件处理完成");}catch (Exception ex){Log($"文件处理异常: {ex.Message}");}}static async Task ProcessSingleFileAsync(string csvFile, Configuration config, BoxClient boxClient){try{string zipFileName = $"{Path.GetFileNameWithoutExtension(csvFile)}_{DateTime.Now:yyyyMMddHHmmss}.zip";string zipPath = Path.Combine(config.ZipFolder, zipFileName);// 压缩文件CreateZipFile(csvFile, zipPath);Log($"文件 {Path.GetFileName(csvFile)} 压缩成功");// 上传到Boxawait UploadToBoxAsync(boxClient, zipPath, config.UploadFolderId);Log($"文件 {zipFileName} 上传成功");// 清理临时压缩文件(可选)File.Delete(zipPath);}catch (Exception ex){Log($"处理文件 {Path.GetFileName(csvFile)} 失败: {ex.Message}");}}static void CreateZipFile(string sourceFile, string zipPath){using (var zipArchive = ZipFile.Open(zipPath, ZipArchiveMode.Create)){zipArchive.CreateEntryFromFile(sourceFile, Path.GetFileName(sourceFile));}}static async Task UploadToBoxAsync(BoxClient client, string filePath, string folderId){using (var fileStream = new FileStream(filePath, FileMode.Open)){var fileRequest = new BoxFileRequest{Name = Path.GetFileName(filePath),Parent = new BoxRequestEntity { Id = folderId }};await client.FilesManager.UploadAsync(fileRequest, fileStream);}}static void Log(string message){string logEntry = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss} - {message}";lock (_logLock){File.AppendAllText(_logPath, logEntry + Environment.NewLine);}}
}public class Configuration
{public string ClientId { get; set; }public string ClientSecret { get; set; }public string AccessToken { get; set; }public string UploadFolderId { get; set; }public string SourceFolder { get; set; }public string ZipFolder { get; set; }public string LogPath { get; set; }
}
实现说明:
-
配置管理:
- 使用
IniParser
包读取INI配置文件 - 配置参数包括Box认证信息、文件路径和日志路径
- Configuration类用于存储配置参数
- 使用
-
Box客户端初始化:
- 使用OAuth 2.0认证
- 需要有效的访问令牌(AccessToken)
-
文件处理:
- 使用并行处理加速文件压缩(Parallel.ForEach)
- 每个文件生成带时间戳的唯一ZIP文件名
- 自动清理临时压缩文件(可选)
-
异步上传:
- 使用Box官方SDK的异步上传方法
- 支持大文件分块上传(SDK自动处理)
-
日志记录:
- 线程安全的日志写入机制
- 包含时间戳和详细操作记录
- 支持并发写入时的文件锁定
-
异常处理:
- 多层异常捕获(全局、文件处理、单个文件)
- 详细的错误信息记录
配置示例(config.ini):
[BoxConfig]
ClientId = your_client_id
ClientSecret = your_client_secret
AccessToken = your_access_token
UploadFolderId = 0[FileConfig]
SourceFolder = C:\CSVFiles
ZipFolder = C:\TempZips
LogPath = C:\Logs\upload.log
注意事项:
-
Box认证:
- 需要有效的Box开发者账号和企业配置
- 建议使用JWT认证代替直接访问令牌(需修改认证逻辑)
-
性能优化:
- 根据网络情况调整并行处理数量
- 添加重试逻辑处理网络波动
-
安全增强:
- 敏感信息(如ClientSecret)建议加密存储
- 使用配置文件权限控制
-
扩展功能:
- 添加文件校验(MD5校验和)
- 实现增量上传功能
- 添加压缩密码保护
-
错误处理:
- 添加不同异常类型的处理逻辑
- 实现死信队列处理持续失败文件
使用时需要安装以下NuGet包:
ini-parser
Box.V2
安装包和发布Release版程序的脚本:
cd <.csproj文件所在的目录>
dotnet add package Box.V2
dotnet add package ini-parser
dotnet build <.csproj文件完整路径> /property:GenerateFullPaths=true /consoleloggerparameters:NoSummary /p:Configuration=Release /p:Platform="AnyCPU"
相关文章:
C#批量压缩并上载CSV数据文件到Box企业云盘
C# .NET 8实现Windows下批量压缩csv文件为zip文件,然后异步上传到box企业云服务网盘路径,实现异常处理和写入运行状态日志,参数来自ini配置文件。 C# .NET 8代码示例,包含INI配置读取、CSV文件压缩、Box上传、异步处理和日志记录…...

C++常见概念
第一个 C 程序 #include<iostream>using namespace std;int main() {cout << "helloworld" << endl;return 0; }命名空间 #include<stdio.h>int rand 10;int main() {printf("%d", rand);return 0; }#include<stdio.h> #…...

结构型模式---享元模式
概念 享元模式是一种结构型设计模式,他摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,让你能在有限的内存容量中载入更多对象。享元模式将原始类中的数据分为内在状态数据和外在状态数据。 内在状态:就…...

2025年渗透测试面试题总结- 深某服-漏洞研究员实习(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 深信服-漏洞研究员实习 1. 在XX实习时做了什么 2. 渗透测试的思路简单描述 3. 护网中承担什么角色 4…...

(13)Anaconda 安装配置详解
1. Anaconda 简介 Anaconda 是一个用于科学计算和数据分析的 Python 发行版,它集成了 Python 解释器、大量常用的科学计算库以及强大的包管理工具。 2. Anaconda 主要特点 丰富的库集合:包含了超过 1500 个用于科学计算、数据分析、机器学习等领域的常用 Python 库,例如 N…...

MWC 2025 | 移远通信大模型解决方案加速落地,引领服务机器人创新变革
随着人工智能、大模型等技术的蓬勃发展,生成式AI应用全面爆发。在此背景下,服务机器人作为大模型技术在端侧落地的关键场景,迎来了前所未有的发展机遇。 作为与用户直接交互的智能设备,服务机器人需要应对复杂场景下的感知、决策和…...

[内网安全] Windows 域认证 — Kerberos 协议认证
🌟想系统化学习内网渗透?看看这个:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:Kerberos 协议简介 Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过…...

[Computer Vision]实验七:图像检索
目录 一、实验内容 二、实验过程 2.1 准备数据集 2.2 SIFT特征提取 2.3 学习“视觉词典”(vision vocabulary) 2.4 建立图像索引并保存到数据库中 2.5 用一幅图像查询 三、实验小结 一、实验内容 实现基于颜色直方图、bag of word等方法的以图搜…...
C++之thread_local变量
C之thread_local变量_c threadlocal-CSDN博客 thread_local简介 thread_local 是 C11 为线程安全引进的变量声明符。表示对象的生命周期属于线程存储期。 线程局部存储(Thread Local Storage,TLS)是一种存储期(storage duration),对象的存储是在…...

【国产Linux | 银河麒麟】麒麟化龙——KylinOS下载到安装一条龙服务,起飞!
🗺️博客地图 📍一、下载地址 📍二、 系统安装 本文基于Windows操作系统vmware虚拟机安装 一、下载地址 官网:产品试用申请国产操作系统、麒麟操作系统——麒麟软件官方网站 下载自己需要的版本,完成后,…...
(接“使用js去复制网页内容的方法”)js中的execCommand怎么复制富文本内容解析
document.execCommand(copy) 是传统的剪贴板操作方法,但它主要用于复制纯文本内容。如果你想复制富文本内容(包括 HTML 标签和样式),需要结合一些技巧来实现。以下是具体方法: 方法:通过创建隐藏的富文本元…...

npm ERR! code 128 npm ERR! An unknown git error occurred
【问题描述】 【问题解决】 管理员运行cmd(右键window --> 选择终端管理员) 执行命令 git config --global url.“https://”.insteadOf ssh://git cd 到项目目录 重新执行npm install 个人原因,这里执行npm install --registryhttps:…...
解决Leetcode第3470题全排列IV
3470.全排列IV 难度:困难 问题描述: 给你两个整数n和k,一个交替排列是前n个正整数的排列,且任意相邻两个元素不都为奇数或都为偶数。 返回第k个交替排列,并按字典序排序。如果有效的交替排列少于k个,则…...
MyBatis 配置文件核心
MyBatis 配置文件核心标签解析 以下是针对你的笔记中的三个核心标签的详细解析,帮助你全面理解它们的用途和配置逻辑。 1. properties 标签:动态加载外部配置 功能 将环境相关的配置(如数据库连接、密钥等)与 MyBatis 核心配置…...

bert模型笔记
1.各预训练模型说明 BERT模型在英文数据集上提供了两种大小的模型,Base和Large。Uncased是意味着输入的词都会转变成小写,cased是意味着输入的词会保存其大写(在命名实体识别等项目上需要)。Multilingual是支持多语言的࿰…...

微信小程序接入deepseek
先上效果 话不多说,直接上代码(本人用的hbuilder Xuniapp) <template><view class"container"><!-- 聊天内容区域 --><scroll-view class"chat-list" scroll-y :scroll-top"scrollTop":…...

推荐算法和推荐系统入门第一趴
以下是推荐系统技术总结的架构梳理和建议表达思路: 从原理到生产环境:推荐系统核心技术与实战代码解析 一、推荐算法的演进图谱 传统算法三剑客 ![推荐系统算法分类示意图] (使用Mermaid绘制算法分类关系图,清晰展示技术演进&am…...

unity pico开发 四 物体交互 抓取 交互层级
文章目录 手部设置物体交互物体抓取添加抓取抓取三种类型抓取点偏移抓取事件抓取时不让物体吸附到手部 射线抓取交互层级 手部设置 为手部(LeftHandController)添加XRDirInteractor脚本 并添加一个球形碰撞盒,勾选isTrigger,调整大小为0.1 …...

基于深度学习的青花瓷图像检索系统开发与实现
目录 1.研究背景与目的 1.1课题背景 1.2研究目的 二、调研资料情况 2.1图像分割研究现状 2.2图像检索调研 2.2.1选择深度学习进行检索的原因及优势 2.2.2基于深度学习的图像检索技术的发展 2.2.3基于深度学习的图像检索的研究重点 2.3基于深度学习的图像检索方法调研 …...
uniapp 系统学习,从入门到实战(八)—— Vuex 的使用
全篇大概 4500 字(含代码),建议阅读时间 30min 📚 目录 Vuex核心概念解析在 UniApp 中集成Vuex状态管理与数据共享实践总结 一、Vuex 核心概念解析 1.1 什么是状态管理 在跨多组件的大型应用中,不同页面/组件需要共享和修改相同数据时&am…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...