Skip to content

Commit edeafb1

Browse files
mishushakovjakubno
andauthored
Adds files.getInfo / files.get_info methods to retrieve information about directory/files (#724)
**Changelog** - Adds `files.getInfo`, `files.get_info` methods to the SDKs. - Adds tests for the new methods - Adds documentation for the above. **Examples** JavaScript ```js import { Sandbox } from '@e2b/code-interpreter' const sandbox = await Sandbox.create() // Create a new file await sandbox.files.write('test_file.txt', 'Hello, world!') // Get information about the file const info = await sandbox.files.getInfo('test_file.txt') console.log(info) // { // name: 'test_file.txt', // type: 'file', // path: '/home/user/test_file.txt' // } ``` Python ```py from e2b_code_interpreter import Sandbox sandbox = Sandbox() # Create a new file sandbox.files.write('test_file', 'Hello, world!') # Get information about the file info = sandbox.files.get_info('test_file') print(info) # EntryInfo(name='test_file.txt', type=<FileType.FILE: 'file'>, path='/home/user/test_file.txt') ``` --------- Co-authored-by: Jakub Novak <jakub@e2b.dev>
1 parent 625f6d8 commit edeafb1

27 files changed

Lines changed: 1097 additions & 100 deletions

File tree

.changeset/proud-ants-flash.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@e2b/python-sdk': minor
3+
'e2b': minor
4+
---
5+
6+
added getInfo/get_info method for file information
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# Get information about a file or directory
2+
3+
You can get information about a file or directory using the `files.getInfo()` / `files.get_info()` methods. Information such as file name, type, and path is returned.
4+
5+
### Getting information about a file
6+
7+
<CodeGroup>
8+
```js
9+
import { Sandbox } from '@e2b/code-interpreter'
10+
11+
const sandbox = await Sandbox.create()
12+
13+
// Create a new file
14+
await sandbox.files.write('test_file.txt', 'Hello, world!')
15+
16+
// Get information about the file
17+
const info = await sandbox.files.getInfo('test_file.txt')
18+
19+
console.log(info)
20+
// {
21+
// name: 'test_file.txt',
22+
// type: 'file',
23+
// path: '/home/user/test_file.txt',
24+
// size: 13,
25+
// mode: 0o644,
26+
// permissions: '-rw-r--r--',
27+
// owner: 'user',
28+
// group: 'user',
29+
// modifiedTime: '2025-05-26T12:00:00.000Z',
30+
// symlinkTarget: null
31+
// }
32+
```
33+
```python
34+
from e2b_code_interpreter import Sandbox
35+
36+
sandbox = Sandbox()
37+
38+
# Create a new file
39+
sandbox.files.write('test_file', 'Hello, world!')
40+
41+
# Get information about the file
42+
info = sandbox.files.get_info('test_file')
43+
44+
print(info)
45+
# EntryInfo(
46+
# name='test_file.txt',
47+
# type=<FileType.FILE: 'file'>,
48+
# path='/home/user/test_file.txt',
49+
# size=13,
50+
# mode=0o644,
51+
# permissions='-rw-r--r--',
52+
# owner='user',
53+
# group='user',
54+
# modified_time='2025-05-26T12:00:00.000Z',
55+
# symlink_target=None
56+
# )
57+
```
58+
</CodeGroup>
59+
60+
### Getting information about a directory
61+
62+
<CodeGroup>
63+
```js
64+
import { Sandbox } from '@e2b/code-interpreter'
65+
66+
const sandbox = await Sandbox.create()
67+
68+
// Create a new directory
69+
await sandbox.files.makeDir('test_dir')
70+
71+
// Get information about the directory
72+
const info = await sandbox.files.getInfo('test_dir')
73+
74+
console.log(info)
75+
// {
76+
// name: 'test_dir',
77+
// type: 'dir',
78+
// path: '/home/user/test_dir',
79+
// size: 0,
80+
// mode: 0o755,
81+
// permissions: 'drwxr-xr-x',
82+
// owner: 'user',
83+
// group: 'user',
84+
// modifiedTime: '2025-05-26T12:00:00.000Z',
85+
// symlinkTarget: null
86+
// }
87+
```
88+
```python
89+
from e2b_code_interpreter import Sandbox
90+
91+
sandbox = Sandbox()
92+
93+
# Create a new directory
94+
sandbox.files.make_dir('test_dir')
95+
96+
# Get information about the directory
97+
info = sandbox.files.get_info('test_dir')
98+
99+
print(info)
100+
# EntryInfo(
101+
# name='test_dir',
102+
# type=<FileType.DIR: 'dir'>,
103+
# path='/home/user/test_dir',
104+
# size=0,
105+
# mode=0o755,
106+
# permissions='drwxr-xr-x',
107+
# owner='user',
108+
# group='user',
109+
# modified_time='2025-05-26T12:00:00.000Z',
110+
# symlink_target=None
111+
# )
112+
```
113+
</CodeGroup>

apps/web/src/components/Navigation/routes.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,10 @@ export const docRoutes: NavGroup[] = [
359359
title: 'Read & write',
360360
href: '/docs/filesystem/read-write',
361361
},
362+
{
363+
title: 'Get info about a file or directory',
364+
href: '/docs/filesystem/info',
365+
},
362366
{
363367
title: 'Watch directory for changes',
364368
href: '/docs/filesystem/watch',

packages/js-sdk/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"test": "vitest run",
3131
"generate": "npm-run-all generate:*",
3232
"generate:api": "python ./../../spec/remove_extra_tags.py sandboxes templates auth && openapi-typescript ../../spec/openapi_generated.yml -x api_key --array-length --alphabetize --output src/api/schema.gen.ts",
33+
"generate:envd": "cd ../../spec/envd && buf generate --template buf-js.gen.yaml\n",
3334
"generate:envd-api": "openapi-typescript ../../spec/envd/envd.yaml -x api_key --array-length --alphabetize --output src/envd/schema.gen.ts",
3435
"generate-ref": "./scripts/generate_sdk_ref.sh",
3536
"check-deps": "knip",

packages/js-sdk/src/envd/filesystem/filesystem_pb.ts

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44

55
import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
66
import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
7+
import type { Timestamp } from "@bufbuild/protobuf/wkt";
8+
import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
79
import type { Message } from "@bufbuild/protobuf";
810

911
/**
1012
* Describes the file filesystem/filesystem.proto.
1113
*/
1214
export const file_filesystem_filesystem: GenFile = /*@__PURE__*/
13-
fileDesc("ChtmaWxlc3lzdGVtL2ZpbGVzeXN0ZW0ucHJvdG8SCmZpbGVzeXN0ZW0iMgoLTW92ZVJlcXVlc3QSDgoGc291cmNlGAEgASgJEhMKC2Rlc3RpbmF0aW9uGAIgASgJIjQKDE1vdmVSZXNwb25zZRIkCgVlbnRyeRgBIAEoCzIVLmZpbGVzeXN0ZW0uRW50cnlJbmZvIh4KDk1ha2VEaXJSZXF1ZXN0EgwKBHBhdGgYASABKAkiNwoPTWFrZURpclJlc3BvbnNlEiQKBWVudHJ5GAEgASgLMhUuZmlsZXN5c3RlbS5FbnRyeUluZm8iHQoNUmVtb3ZlUmVxdWVzdBIMCgRwYXRoGAEgASgJIhAKDlJlbW92ZVJlc3BvbnNlIhsKC1N0YXRSZXF1ZXN0EgwKBHBhdGgYASABKAkiNAoMU3RhdFJlc3BvbnNlEiQKBWVudHJ5GAEgASgLMhUuZmlsZXN5c3RlbS5FbnRyeUluZm8iSwoJRW50cnlJbmZvEgwKBG5hbWUYASABKAkSIgoEdHlwZRgCIAEoDjIULmZpbGVzeXN0ZW0uRmlsZVR5cGUSDAoEcGF0aBgDIAEoCSItCg5MaXN0RGlyUmVxdWVzdBIMCgRwYXRoGAEgASgJEg0KBWRlcHRoGAIgASgNIjkKD0xpc3REaXJSZXNwb25zZRImCgdlbnRyaWVzGAEgAygLMhUuZmlsZXN5c3RlbS5FbnRyeUluZm8iMgoPV2F0Y2hEaXJSZXF1ZXN0EgwKBHBhdGgYASABKAkSEQoJcmVjdXJzaXZlGAIgASgIIkQKD0ZpbGVzeXN0ZW1FdmVudBIMCgRuYW1lGAEgASgJEiMKBHR5cGUYAiABKA4yFS5maWxlc3lzdGVtLkV2ZW50VHlwZSLgAQoQV2F0Y2hEaXJSZXNwb25zZRI4CgVzdGFydBgBIAEoCzInLmZpbGVzeXN0ZW0uV2F0Y2hEaXJSZXNwb25zZS5TdGFydEV2ZW50SAASMQoKZmlsZXN5c3RlbRgCIAEoCzIbLmZpbGVzeXN0ZW0uRmlsZXN5c3RlbUV2ZW50SAASOwoJa2VlcGFsaXZlGAMgASgLMiYuZmlsZXN5c3RlbS5XYXRjaERpclJlc3BvbnNlLktlZXBBbGl2ZUgAGgwKClN0YXJ0RXZlbnQaCwoJS2VlcEFsaXZlQgcKBWV2ZW50IjcKFENyZWF0ZVdhdGNoZXJSZXF1ZXN0EgwKBHBhdGgYASABKAkSEQoJcmVjdXJzaXZlGAIgASgIIisKFUNyZWF0ZVdhdGNoZXJSZXNwb25zZRISCgp3YXRjaGVyX2lkGAEgASgJIi0KF0dldFdhdGNoZXJFdmVudHNSZXF1ZXN0EhIKCndhdGNoZXJfaWQYASABKAkiRwoYR2V0V2F0Y2hlckV2ZW50c1Jlc3BvbnNlEisKBmV2ZW50cxgBIAMoCzIbLmZpbGVzeXN0ZW0uRmlsZXN5c3RlbUV2ZW50IioKFFJlbW92ZVdhdGNoZXJSZXF1ZXN0EhIKCndhdGNoZXJfaWQYASABKAkiFwoVUmVtb3ZlV2F0Y2hlclJlc3BvbnNlKlIKCEZpbGVUeXBlEhkKFUZJTEVfVFlQRV9VTlNQRUNJRklFRBAAEhIKDkZJTEVfVFlQRV9GSUxFEAESFwoTRklMRV9UWVBFX0RJUkVDVE9SWRACKpgBCglFdmVudFR5cGUSGgoWRVZFTlRfVFlQRV9VTlNQRUNJRklFRBAAEhUKEUVWRU5UX1RZUEVfQ1JFQVRFEAESFAoQRVZFTlRfVFlQRV9XUklURRACEhUKEUVWRU5UX1RZUEVfUkVNT1ZFEAMSFQoRRVZFTlRfVFlQRV9SRU5BTUUQBBIUChBFVkVOVF9UWVBFX0NITU9EEAUynwUKCkZpbGVzeXN0ZW0SOQoEU3RhdBIXLmZpbGVzeXN0ZW0uU3RhdFJlcXVlc3QaGC5maWxlc3lzdGVtLlN0YXRSZXNwb25zZRJCCgdNYWtlRGlyEhouZmlsZXN5c3RlbS5NYWtlRGlyUmVxdWVzdBobLmZpbGVzeXN0ZW0uTWFrZURpclJlc3BvbnNlEjkKBE1vdmUSFy5maWxlc3lzdGVtLk1vdmVSZXF1ZXN0GhguZmlsZXN5c3RlbS5Nb3ZlUmVzcG9uc2USQgoHTGlzdERpchIaLmZpbGVzeXN0ZW0uTGlzdERpclJlcXVlc3QaGy5maWxlc3lzdGVtLkxpc3REaXJSZXNwb25zZRI/CgZSZW1vdmUSGS5maWxlc3lzdGVtLlJlbW92ZVJlcXVlc3QaGi5maWxlc3lzdGVtLlJlbW92ZVJlc3BvbnNlEkcKCFdhdGNoRGlyEhsuZmlsZXN5c3RlbS5XYXRjaERpclJlcXVlc3QaHC5maWxlc3lzdGVtLldhdGNoRGlyUmVzcG9uc2UwARJUCg1DcmVhdGVXYXRjaGVyEiAuZmlsZXN5c3RlbS5DcmVhdGVXYXRjaGVyUmVxdWVzdBohLmZpbGVzeXN0ZW0uQ3JlYXRlV2F0Y2hlclJlc3BvbnNlEl0KEEdldFdhdGNoZXJFdmVudHMSIy5maWxlc3lzdGVtLkdldFdhdGNoZXJFdmVudHNSZXF1ZXN0GiQuZmlsZXN5c3RlbS5HZXRXYXRjaGVyRXZlbnRzUmVzcG9uc2USVAoNUmVtb3ZlV2F0Y2hlchIgLmZpbGVzeXN0ZW0uUmVtb3ZlV2F0Y2hlclJlcXVlc3QaIS5maWxlc3lzdGVtLlJlbW92ZVdhdGNoZXJSZXNwb25zZUJpCg5jb20uZmlsZXN5c3RlbUIPRmlsZXN5c3RlbVByb3RvUAGiAgNGWFiqAgpGaWxlc3lzdGVtygIKRmlsZXN5c3RlbeICFkZpbGVzeXN0ZW1cR1BCTWV0YWRhdGHqAgpGaWxlc3lzdGVtYgZwcm90bzM");
15+
fileDesc("ChtmaWxlc3lzdGVtL2ZpbGVzeXN0ZW0ucHJvdG8SCmZpbGVzeXN0ZW0iMgoLTW92ZVJlcXVlc3QSDgoGc291cmNlGAEgASgJEhMKC2Rlc3RpbmF0aW9uGAIgASgJIjQKDE1vdmVSZXNwb25zZRIkCgVlbnRyeRgBIAEoCzIVLmZpbGVzeXN0ZW0uRW50cnlJbmZvIh4KDk1ha2VEaXJSZXF1ZXN0EgwKBHBhdGgYASABKAkiNwoPTWFrZURpclJlc3BvbnNlEiQKBWVudHJ5GAEgASgLMhUuZmlsZXN5c3RlbS5FbnRyeUluZm8iHQoNUmVtb3ZlUmVxdWVzdBIMCgRwYXRoGAEgASgJIhAKDlJlbW92ZVJlc3BvbnNlIhsKC1N0YXRSZXF1ZXN0EgwKBHBhdGgYASABKAkiNAoMU3RhdFJlc3BvbnNlEiQKBWVudHJ5GAEgASgLMhUuZmlsZXN5c3RlbS5FbnRyeUluZm8i/QEKCUVudHJ5SW5mbxIMCgRuYW1lGAEgASgJEiIKBHR5cGUYAiABKA4yFC5maWxlc3lzdGVtLkZpbGVUeXBlEgwKBHBhdGgYAyABKAkSDAoEc2l6ZRgEIAEoAxIMCgRtb2RlGAUgASgNEhMKC3Blcm1pc3Npb25zGAYgASgJEg0KBW93bmVyGAcgASgJEg0KBWdyb3VwGAggASgJEjEKDW1vZGlmaWVkX3RpbWUYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhsKDnN5bWxpbmtfdGFyZ2V0GAogASgJSACIAQFCEQoPX3N5bWxpbmtfdGFyZ2V0Ii0KDkxpc3REaXJSZXF1ZXN0EgwKBHBhdGgYASABKAkSDQoFZGVwdGgYAiABKA0iOQoPTGlzdERpclJlc3BvbnNlEiYKB2VudHJpZXMYASADKAsyFS5maWxlc3lzdGVtLkVudHJ5SW5mbyIyCg9XYXRjaERpclJlcXVlc3QSDAoEcGF0aBgBIAEoCRIRCglyZWN1cnNpdmUYAiABKAgiRAoPRmlsZXN5c3RlbUV2ZW50EgwKBG5hbWUYASABKAkSIwoEdHlwZRgCIAEoDjIVLmZpbGVzeXN0ZW0uRXZlbnRUeXBlIuABChBXYXRjaERpclJlc3BvbnNlEjgKBXN0YXJ0GAEgASgLMicuZmlsZXN5c3RlbS5XYXRjaERpclJlc3BvbnNlLlN0YXJ0RXZlbnRIABIxCgpmaWxlc3lzdGVtGAIgASgLMhsuZmlsZXN5c3RlbS5GaWxlc3lzdGVtRXZlbnRIABI7CglrZWVwYWxpdmUYAyABKAsyJi5maWxlc3lzdGVtLldhdGNoRGlyUmVzcG9uc2UuS2VlcEFsaXZlSAAaDAoKU3RhcnRFdmVudBoLCglLZWVwQWxpdmVCBwoFZXZlbnQiNwoUQ3JlYXRlV2F0Y2hlclJlcXVlc3QSDAoEcGF0aBgBIAEoCRIRCglyZWN1cnNpdmUYAiABKAgiKwoVQ3JlYXRlV2F0Y2hlclJlc3BvbnNlEhIKCndhdGNoZXJfaWQYASABKAkiLQoXR2V0V2F0Y2hlckV2ZW50c1JlcXVlc3QSEgoKd2F0Y2hlcl9pZBgBIAEoCSJHChhHZXRXYXRjaGVyRXZlbnRzUmVzcG9uc2USKwoGZXZlbnRzGAEgAygLMhsuZmlsZXN5c3RlbS5GaWxlc3lzdGVtRXZlbnQiKgoUUmVtb3ZlV2F0Y2hlclJlcXVlc3QSEgoKd2F0Y2hlcl9pZBgBIAEoCSIXChVSZW1vdmVXYXRjaGVyUmVzcG9uc2UqUgoIRmlsZVR5cGUSGQoVRklMRV9UWVBFX1VOU1BFQ0lGSUVEEAASEgoORklMRV9UWVBFX0ZJTEUQARIXChNGSUxFX1RZUEVfRElSRUNUT1JZEAIqmAEKCUV2ZW50VHlwZRIaChZFVkVOVF9UWVBFX1VOU1BFQ0lGSUVEEAASFQoRRVZFTlRfVFlQRV9DUkVBVEUQARIUChBFVkVOVF9UWVBFX1dSSVRFEAISFQoRRVZFTlRfVFlQRV9SRU1PVkUQAxIVChFFVkVOVF9UWVBFX1JFTkFNRRAEEhQKEEVWRU5UX1RZUEVfQ0hNT0QQBTKfBQoKRmlsZXN5c3RlbRI5CgRTdGF0EhcuZmlsZXN5c3RlbS5TdGF0UmVxdWVzdBoYLmZpbGVzeXN0ZW0uU3RhdFJlc3BvbnNlEkIKB01ha2VEaXISGi5maWxlc3lzdGVtLk1ha2VEaXJSZXF1ZXN0GhsuZmlsZXN5c3RlbS5NYWtlRGlyUmVzcG9uc2USOQoETW92ZRIXLmZpbGVzeXN0ZW0uTW92ZVJlcXVlc3QaGC5maWxlc3lzdGVtLk1vdmVSZXNwb25zZRJCCgdMaXN0RGlyEhouZmlsZXN5c3RlbS5MaXN0RGlyUmVxdWVzdBobLmZpbGVzeXN0ZW0uTGlzdERpclJlc3BvbnNlEj8KBlJlbW92ZRIZLmZpbGVzeXN0ZW0uUmVtb3ZlUmVxdWVzdBoaLmZpbGVzeXN0ZW0uUmVtb3ZlUmVzcG9uc2USRwoIV2F0Y2hEaXISGy5maWxlc3lzdGVtLldhdGNoRGlyUmVxdWVzdBocLmZpbGVzeXN0ZW0uV2F0Y2hEaXJSZXNwb25zZTABElQKDUNyZWF0ZVdhdGNoZXISIC5maWxlc3lzdGVtLkNyZWF0ZVdhdGNoZXJSZXF1ZXN0GiEuZmlsZXN5c3RlbS5DcmVhdGVXYXRjaGVyUmVzcG9uc2USXQoQR2V0V2F0Y2hlckV2ZW50cxIjLmZpbGVzeXN0ZW0uR2V0V2F0Y2hlckV2ZW50c1JlcXVlc3QaJC5maWxlc3lzdGVtLkdldFdhdGNoZXJFdmVudHNSZXNwb25zZRJUCg1SZW1vdmVXYXRjaGVyEiAuZmlsZXN5c3RlbS5SZW1vdmVXYXRjaGVyUmVxdWVzdBohLmZpbGVzeXN0ZW0uUmVtb3ZlV2F0Y2hlclJlc3BvbnNlQmkKDmNvbS5maWxlc3lzdGVtQg9GaWxlc3lzdGVtUHJvdG9QAaICA0ZYWKoCCkZpbGVzeXN0ZW3KAgpGaWxlc3lzdGVt4gIWRmlsZXN5c3RlbVxHUEJNZXRhZGF0YeoCCkZpbGVzeXN0ZW1iBnByb3RvMw", [file_google_protobuf_timestamp]);
1416

1517
/**
1618
* @generated from message filesystem.MoveRequest
@@ -167,6 +169,43 @@ export type EntryInfo = Message<"filesystem.EntryInfo"> & {
167169
* @generated from field: string path = 3;
168170
*/
169171
path: string;
172+
173+
/**
174+
* @generated from field: int64 size = 4;
175+
*/
176+
size: bigint;
177+
178+
/**
179+
* @generated from field: uint32 mode = 5;
180+
*/
181+
mode: number;
182+
183+
/**
184+
* @generated from field: string permissions = 6;
185+
*/
186+
permissions: string;
187+
188+
/**
189+
* @generated from field: string owner = 7;
190+
*/
191+
owner: string;
192+
193+
/**
194+
* @generated from field: string group = 8;
195+
*/
196+
group: string;
197+
198+
/**
199+
* @generated from field: google.protobuf.Timestamp modified_time = 9;
200+
*/
201+
modifiedTime?: Timestamp;
202+
203+
/**
204+
* If the entry is a symlink, this field contains the target of the symlink.
205+
*
206+
* @generated from field: optional string symlink_target = 10;
207+
*/
208+
symlinkTarget?: string;
170209
};
171210

172211
/**

packages/js-sdk/src/index.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,12 @@ export type { Logger } from './logs'
1717
export { getSignature } from './sandbox/signature'
1818

1919
export { FileType } from './sandbox/filesystem'
20-
export type { EntryInfo, Filesystem } from './sandbox/filesystem'
20+
export type { WriteInfo, EntryInfo, Filesystem } from './sandbox/filesystem'
2121
export { FilesystemEventType } from './sandbox/filesystem/watchHandle'
22-
export type { FilesystemEvent, WatchHandle } from './sandbox/filesystem/watchHandle'
22+
export type {
23+
FilesystemEvent,
24+
WatchHandle,
25+
} from './sandbox/filesystem/watchHandle'
2326

2427
export { CommandExitError } from './sandbox/commands/commandHandle'
2528
export type {

0 commit comments

Comments
 (0)