2.编写一个程序,列出某个目录里所有子目录的名称,以及所有文件的名字和大小(以Kbyte为单位)。
时间: 2024-03-03 21:47:59 浏览: 19
以下是 Python 代码实现:
```python
import os
def get_size(path):
"""
获取文件大小
"""
size = os.path.getsize(path)
return size / 1024
def list_files(path):
"""
列出所有文件和子目录
"""
for root, dirs, files in os.walk(path):
for name in files:
file_path = os.path.join(root, name)
print(f"文件:{file_path},大小:{get_size(file_path)} KB")
for name in dirs:
dir_path = os.path.join(root, name)
print(f"目录:{dir_path}")
# 测试
list_files("/path/to/directory")
```
此代码会遍历指定目录下的所有文件和子目录,并输出文件名、大小和目录名。其中 `get_size` 函数用于获取文件大小,`list_files` 函数用于列出所有文件和子目录。
相关问题
使用c语言解析一个json文件,请提供c代码,尽量使用cjson库,请考虑json文件大小,尽量节省内存在10kbyte以内
以下是使用cjson库解析json文件的c代码,同时考虑了json文件大小和内存节省:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"
#define BUFFER_SIZE 1024
int main(int argc, char* argv[])
{
FILE* json_file = fopen("example.json", "r");
if (!json_file) {
printf("Failed to open json file.\n");
return 1;
}
char buffer[BUFFER_SIZE];
memset(buffer, 0, BUFFER_SIZE);
size_t read_size = fread(buffer, 1, BUFFER_SIZE - 1, json_file);
if (ferror(json_file)) {
printf("Failed to read json file.\n");
fclose(json_file);
return 1;
}
cJSON* json_obj = cJSON_Parse(buffer);
if (!json_obj) {
printf("Failed to parse json file.\n");
fclose(json_file);
return 1;
}
// do something with json object
cJSON_Delete(json_obj);
fclose(json_file);
return 0;
}
```
说明:
1. 首先使用fopen打开json文件,如果失败则返回错误。
2. 为了节省内存,我们只读取了部分json文件(BUFFER_SIZE大小的字节数),并使用memset将buffer清零。
3. 使用fread读取json文件,如果失败则返回错误。
4. 使用cJSON_Parse将buffer解析为cJSON对象,如果失败则返回错误。
5. 在得到cJSON对象后,可以对其进行操作,这里省略。
6. 使用cJSON_Delete释放cJSON对象,关闭文件,返回。
注意事项:
1. 由于json文件可能含有敏感信息,因此不要自动记录用户输入的文件名,而是直接写死在代码中,避免被用户篡改。
2. 在读取json文件时,要考虑文件大小,不要一次性读取过多数据,导致内存占用过高。
3. 如果json文件大小超过了内存可以承受的范围,可以考虑将json文件分割为多个部分,分别解析。
高速缓存容量为 4 Kbyte ,高速缓存数据块的大小为256 byte。考虑以下两种设计: 1)直接映射(direct mapped) 2)使用LRU替换策略的全相联映射 (fully associative cache with an LRU replacement policy) 假设内存物理地址为16位, 请找出一个地址访问序列(内存地址可以用四位16进制数表示),使得重复无限次地访问这个地址序列,可以导致直接映射高速缓存的命中率比采用LRU替换策略的全相联映射高速缓存的命中率高。
假设直接映射高速缓存有16个数据块,全相联映射高速缓存也有16个数据块,且LRU替换策略会始终选择最近最少被使用的数据块进行替换。下面是一个可能的地址访问序列:
```
0000
0001
0002
0003
0004
0005
0006
0007
0008
0009
000a
000b
000c
000d
000e
000f
0000
0100
0200
0300
0400
0500
0600
0700
0800
0900
0a00
0b00
0c00
0d00
0e00
0f00
```
在这个地址访问序列中,首先顺序地访问了16个不同的地址,使得直接映射高速缓存中的每个数据块都被填满了,而全相联映射高速缓存中只有一个数据块被填满了。接着,按照每个地址的前两个十六进制数字依次访问了16个地址,使得直接映射高速缓存中的每个数据块都对应了下一个被访问的地址,因此可以命中缓存;而全相联映射高速缓存由于采用了LRU替换策略,每次都会替换掉最近最少被使用的数据块,因此无法命中缓存。因此,重复无限次地访问这个地址序列,可以导致直接映射高速缓存的命中率比采用LRU替换策略的全相联映射高速缓存的命中率高。